lamda的使用,并行流带来的问题,parallelStream()与stream()

1.并行流使用陷阱parallelStream.

(1)并行流并不是串行执行的,parallelStream()区别于stream(), 底层使用ForkJoinPool起多线程

(2)请谨慎评估是否有线程安全问题,不同场景选用不同的合适的流。

串行流:串行任务,有序阻塞,线程安全。

并行流:多线程并行处理,无序无阻塞,线程非安全。

两种流结果如下:

 

List<String> list = Arrays.asList("A","B","C","D","E");
      
list.forEach(result -> System.out.println("stream:"+result));
list.parallelStream().forEach(result->System.out.println("parallelStream:"+result));

2.stream流里面操作return不会真正return,会导致和预期结果不一致.

结果:

 

3.用Collectors.toMap(a, b) 时,如果b出现null的情况会导致NPE异常。

//BusinessDataQuery::getKey 为null
        Map<String, String> collect = businessDataQueries.stream().collect(Collectors.toMap(BusinessDataQuery::getCityCode, BusinessDataQuery::getKey));
        System.out.println(collect);

 

如果a为null,无论key的值是否有重复都将出现 duplicate key的异常
//BusinessDataQuery::getKey 为null  BusinessDataQuery::getCityCode不为null
BusinessDataQuery businessDataQuery = new BusinessDataQuery();
        BusinessDataQuery businessDataQuery1 = new BusinessDataQuery();
        BusinessDataQuery businessDataQuery2 = new BusinessDataQuery();
        BusinessDataQuery businessDataQuery3 = new BusinessDataQuery();
        businessDataQuery.setCityCode("432432232342");
        businessDataQuery1.setCityCode("43243242");
        businessDataQuery2.setCityCode("fgqte");
        businessDataQuery3.setCityCode("432rewr43242");        
Map<String, String> collect = businessDataQueries.stream().collect(Collectors.toMap(BusinessDataQuery::getKey,BusinessDataQuery::getCityCode));
        System.out.println(collect);

 

 当a、b都不为null时,a如果有重复,依旧会出现duplicate key的异常

businessDataQuery.setKey("432432232342");
        businessDataQuery1.setKey("fgqte");
        businessDataQuery2.setKey("fgqte");
        businessDataQuery3.setKey("432rewr43242");
        //BusinessDataQuery::getKey 为null  BusinessDataQuery::getCityCode不为null
        Map<String, String> collect = businessDataQueries.stream().collect(Collectors.toMap(BusinessDataQuery::getKey,BusinessDataQuery::getCityCode));
        System.out.println(collect);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值