Java 1.8 Stream流

Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选、排序、聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由终端操作 (terminal operation) 得到前面处理的结果。

stream分类

  1. 顺序流:顺序流是按照顺序对集合中的元素进行处理
  2. 并行流:并行流是使用多线程同时对集合中多个元素进行处理

终端操作和中间操作

  1. 终端操作:终端操作会消费 Stream 流,并且会产生一个结果,比如 iterator() 和 spliterator()。如果一个 Stream 流被消费过了,那它就不能被重用的。
  2. 中间操作:中间操作会产生另一个流。需要注意的是中间操作不是立即发生的。而是当在中间操作创建的新流上执行完终端操作后,中间操作指定的操作才会发生。流的中间操作还分无状态操作和有状态操作两种。
    • 在无状态操作中,在处理流中的元素时,会对当前的元素进行单独处理。比如,过滤操作,因为每个元素都是被单独进行处理的,所有它和流中的其它元素无关。
    • 在有状态操作中,某个元素的处理可能依赖于其他元素。比如查找最小值,最大值,和排序,因为他们都依赖于其他的元素。

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));
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值