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