概述:
Stream是java8中的新特性,允许以声明式的方式处理数据集合,可以把它看作是遍历数据集的高级迭代器。此外与stream与lambda表达式结合后编码效率提高,可读性更强。Stream与InputStream和OutputStream是完全不同的概念。
流的定义:就是“从支持数据处理操作的源,生成的元素序列”。
元素列表:和集合一样,流也提供了一个接口,访问特定元素类型的一组有序值。
数据源:获取数据的源,比如集合。
数据处理操作:流更偏向于数据处理和计算,比如 filter、map、find、sort 等。简单来说,我们通过一个集合的 stream 方法获取一个流,然后对流进行一系列流操作,最后再构建成我们需要的数据集合。
获取流:
//集合中获取流, 集合是数据源,不对数据源进行操作,将集合中的数据放入stream对象中,对stream中的数据操作
ArrayList<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
//数组获取流
Integer[] a = new Integer[10];
Stream<Integer> stream1 = Arrays.stream(a);
流的操作分为:中间操作和终端操作
List<Integer> alist = stream2
.filter((e)->{return e>3;}) //中间操作 条件过滤
.collect(Collectors.toList()); //终端操作 将流转为我们想要的结果
System.out.println(alist);
简化一下即为:数据源->中间操作->终端操作->结果
中间操作:
filter:过滤流中的某些元素。
sorted(): 自然排序,流中元素需实现 Comparable 接口。
distinct: 去除重复元素。
limit(n): 获取 n 个元素。
skip(n): 跳过 n 元素,配合limit(n)可实现分页。
map(): 将其映射成一个新的元素。
终端操作:
forEach: 遍历流中的元素。
toArray:将流中的元素倒入一个数组。
Min:返回流中元素最小值。
Max:返回流中元素最大值。
count:返回流中元素的总个数。
Reduce:所有元素求和。
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返 回 true,否则返回 false。
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返 回 true,否则返回 false。
findFirst:返回流中第一个元素。collect:将流中的元素倒入一个集合,Collection 或 Map。