Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选、排序、聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由终端操作 (terminal operation) 得到前面处理的结果。
stream分类
- 顺序流:顺序流是按照顺序对集合中的元素进行处理
- 并行流:并行流是使用多线程同时对集合中多个元素进行处理
终端操作和中间操作
- 终端操作:终端操作会消费 Stream 流,并且会产生一个结果,比如 iterator() 和 spliterator()。如果一个 Stream 流被消费过了,那它就不能被重用的。
- 中间操作:中间操作会产生另一个流。需要注意的是中间操作不是立即发生的。而是当在中间操作创建的新流上执行完终端操作后,中间操作指定的操作才会发生。流的中间操作还分无状态操作和有状态操作两种。
- 在无状态操作中,在处理流中的元素时,会对当前的元素进行单独处理。比如,过滤操作,因为每个元素都是被单独进行处理的,所有它和流中的其它元素无关。
- 在有状态操作中,某个元素的处理可能依赖于其他元素。比如查找最小值,最大值,和排序,因为他们都依赖于其他的元素。
public class ProvinceInfo implements Serializable {
private Integer id;
private String name;
}
/**
* @program: StreamTest
* @description: Stream流 测试用例
* @author: xieyuhui
* @create: 2019-09-07 11:17
**/
public class StreamTest {
private static List<ProvinceInfo> provinceInfos = new ArrayList<>();
static {
ProvinceInfo provinceInfo1 = ProvinceInfo.builder().id(1).name("上海").build();
ProvinceInfo provinceInfo2 = ProvinceInfo.builder().id(2).name("江苏").build();
ProvinceInfo provinceInfo3 = ProvinceInfo.builder().id(3).name("江西").build();
ProvinceInfo provinceInfo4 = ProvinceInfo.builder().id(4).name("福建").build();
ProvinceInfo provinceInfo5 = ProvinceInfo.builder().id(5).name("北京").build();
provinceInfos.add(provinceInfo1);
provinceInfos.add(provinceInfo2);
provinceInfos.add(provinceInfo3);
provinceInfos.add(provinceInfo4);
provinceInfos.add(provinceInfo5);
}
public static void main(String[] args) {
Optional<ProvinceInfo> provinceInfo = provinceInfos.stream().findAny();
System.out.println(provinceInfo.get().getName());
//stream filter 过滤操作
List<ProvinceInfo> result1 = provinceInfos.stream().filter(p -> p.getId() > 4).collect(Collectors.toList());
System.out.println(JSONObject.toJSON(result1));
//stream map 映射操作
List<String> result2 = provinceInfos.stream().filter(p -> p.getId() > 2).
map(ProvinceInfo::getName).collect(Collectors.toList());
System.out.println(JSONObject.toJSON(result2));
//stream reduce 缩减操作
Optional<Integer> result4 = provinceInfos.stream().map(ProvinceInfo::getId).reduce((a, b) -> a + b);
System.out.println(JSONObject.toJSON(result4));
//stream collect 收集操作
Map<Integer, ProvinceInfo> result3 = provinceInfos.stream().filter(p -> p.getId() > 2)
.collect(Collectors.toMap(ProvinceInfo::getId, p -> p));
System.out.println(JSONObject.toJSON(result3));
}
}