一、关于Stream前言
Stream是 Java 8 的一大亮点,得尽快学会用哦,都2020年了还不会得我得抓紧了。
1、Stream关注的是对数据的运算,与CPU打交道;集合关注的是数据的存储,与内存打交道
2、
①Stream自己不会存储元素。
②Stream不会改变源对象。相反,他们会返回一个特有接口的新Stream.
③Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行
3、Stream执行流程
①Stream的实例化
②一系列的中间操作(过滤、映射、…)
③终止操作
4、说明:
4.1、一个中间操作链,对数据源的数据进行处理;
4.2、一旦执行终止操作,就执行中间操作链,并产生接口。之后,不会再被使用
参考B站视频(尚硅谷java高级语言)
二、操作Stream
(一)、实例化
@Test
public void test1(){
List<Integer> list = new ArrayList<>();
list.add(123);
Stream<Integer> stream = list.stream();
Stream<Integer> integerStream = list.parallelStream();
}
@Test
public void test2(){
int[] arr ={1,3,10};
IntStream stream1 = Arrays.stream(arr);
Integer[] integers ={3,8,1};
Stream<Integer> stream2 = Arrays.stream(integers);
}
@Test
public void test3(){
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
}
@Test
public void test4(){
Stream.iterate(0,t->t+2).limit(10).forEach(System.out::println);
Stream.generate(Math::random).limit(10).forEach(System.out::println);
}
(二)中间操作
2.1 筛选与切片
不知所以然,但通过代码操作还是大概能知道其设计目的。
@Test
public void test1(){
List<Integer> list = new ArrayList<>();
list.add(123); list.add(345); list.add(237); list.add(912);
Stream<Integer> stream = list.stream();
stream.filter(integer -> integer>300).forEach(System.out::println);
System.out.println("*************************************************");
list.stream().limit(3).forEach(System.out::println);
System.out.println("*************************************************");
list.stream().skip(3).forEach(System.out::println);
System.out.println("*************************************************");
list.add(456); list.add(222); list.add(101); list.add(123); list.add(1); list.add(123);
list.stream().distinct().forEach(System.out::println);
}
2.2映射
@Test
public void test2(){
List<String> strings = Arrays.asList("aa", "bb", "cc", "dd", "eeee", "ffff");
strings.stream().map(str -> str.toUpperCase()).forEach(System.out::println);
strings.stream().map(str->str.length()>3).forEach(System.out::println);
Stream<Stream<Character>> streamStream = strings.stream().map(StreamAPITest1::fromStringToStream);
streamStream.forEach(s->{
s.forEach(System.out::println);
});
System.out.println("**************************************");
Stream<Character> characterStream = strings.stream().flatMap(StreamAPITest1::fromStringToStream);
characterStream.forEach(System.out::println);
}
public static Stream<Character> fromStringToStream(String str){
ArrayList<Character> list = new ArrayList<>();
for(Character c: str.toCharArray()){
list.add(c);
}
return list.stream();
}
两个映射操作有点向集合中add()和addall()方法,可以自己去体会。
2.3 排序
@Test
public void test3(){
List<String> list = Arrays.asList("aa","cc","bb");
Stream<String> stream3 = list.stream().sorted();
stream3.forEach(System.out::println);
List<Integer> arr = Arrays.asList(1,3,2,6,8,3,9);
arr.stream().sorted((i1,i2)->{
return Integer.compare(i1,i2);
}).forEach(System.out::println);
}
(三)终止操作
一切尽在代码中
3.1查找与匹配
@Test
public void test1(){
List<Integer> list = Arrays.asList(1,3,2,6,8,3,9);
boolean b = list.stream().allMatch(x -> x > 3);
System.out.println(b);
boolean b1 = list.stream().anyMatch(x -> x == 3);
System.out.println(b1);
boolean b2 = list.stream().noneMatch(x -> x > 10);
System.out.println(b2);
Optional<Integer> first = list.stream().findFirst();
System.out.println(first);
Optional<Integer> any = list.stream().findAny();
System.out.println(any);
long count = list.stream().count();
System.out.println(count);
Optional<Integer> max = list.stream().max(Integer::compareTo);
System.out.println(max);
Optional<Integer> min = list.stream().min(Integer::compareTo);
System.out.println(min);
}
3.2归约
@Test
public void test2(){
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Integer reduce = list.stream().reduce(0, Integer::sum);
System.out.println(reduce);
Optional<Integer> reduce1 = list.stream().reduce((x, y) -> x + y);
System.out.println(reduce1.get());
}
3.3 收集
③收集
collect----将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
Colloector 接口中方法的实现决定了如何对流执行手机操作(如收集到List、Set、Map中)但是Collectots实用类提供了很多静态方法,可以方便的创建常见收集器实例
这里暂时先不写了,可先参考Colloector接口相应的方法。