Stream类用在集合的数据处理方面十分方便,较传统的遍历处理法来说,简直不要太爽。其实这种流式操作在著名的Rxjava里面可能已经用过,只是现在提供了一个官方的API。
1、Stream对象的创建
- Collection接口都有一个stream()函数,生成相应的Stream对象。
- Stream类里面提供了静态方法of(T t)、of(T ... values)
// Collection接口的stream()方法
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
// Stream类的静态方法
Stream<Integer> integerStream = Stream.of(1, 2, 3, 1, 5);
2、Stream提供的一系列流式操作函数
– filter: 按照给定的过滤规则过滤元素
– map:按照指定的规则处理stream里的元素, 生成一个新的stream,新的stream中元素和原来stream中元素一一对应
– distinct : 去除stream里的重复元素
– flatMap : 和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中
List<String> list1 = Arrays.asList("1", "5", "2", "10", "3");
List<String> list2 = Arrays.asList("2", "0");
List<String> list3 = Arrays.asList("4", "9", "8");
List<String> list4 = Arrays.asList("6");
Stream<List<String>> listStream = Stream.of(list1, list2, list3, list4);
listStream.flatMap(list -> list.stream()).forEach(System.out::println);
//output
1
5
2
10
3
2
0
4
9
8
6
– peek : 给定一个函数, 当stream里的元素被消费的时候就会执行这个函数
List<String> list1 = Arrays.asList("1", "5", "2", "10", "3");
list1.stream()
.peek(x -> System.out.println(x + ",被消费了"))
.forEach(System.out::println);
// output
1,被消费了
1
5,被消费了
5
2,被消费了
2
10,被消费了
10
3,被消费了
3
– reduce 可以用来数组求和等操作
一个参数: Optional<T> reduce(BinaryOperator<T> accumulator);
Stream<Integer> integerStream = Stream.of(1, 2, 3, 1, 5);
Optional<Integer> optional = integerStream.reduce((sum, item) -> {
System.out.printf("sum =%d , item = %d \n", sum, item);
return sum + item;
});
System.out.println(optional.get());
//output
sum =1 , item = 2
sum =3 , item = 3
sum =6 , item = 1
sum =7 , item = 5
12
注意:第一次执行的时候第一个参数的值是Stream的第一个元素,第二个参数是Stream的第二个元素
两个参数:T reduce(T identity, BinaryOperator<T> accumulator);
这里的T是提供一个初始值,如果数组求和的话 第一个值设为0即可,比如我把初值设置为100
Integer reduce = integerStream.reduce(100, (sum, item) -> {
System.out.printf("sum =%d , item = %d \n", sum, item);
return sum + item;
});
System.out.println(reduce);
//output
sum =100 , item = 1
sum =101 , item = 2
sum =103 , item = 3
sum =106 , item = 1
sum =107 , item = 5
112
– limit 截取前 n个元素
– skip 丢弃前n个元素
– allMatch:是不是Stream中的所有元素都满足给定的匹配条件
– anyMatch:Stream中是否存在任何一个元素满足匹配条件
– findFirst: 返回Stream中的第一个元素,如果Stream为空,返回空Optional
– noneMatch:是不是Stream中的所有元素都不满足给定的匹配条件
– max和min:使用给定的比较器(Operator),返回Stream中的最大|最小值