Java8中的Stream

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

二、流的操作类型

即可以对一个流做哪些处理;也即如何消费流。

Intermediate(中间的) :一个流可以后面跟随零个或多个 intermediate 操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。
Terminal (最后的):一个流只能有一个 terminal 操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。
在对于一个 Stream 进行多次转换操作 (Intermediate 操作),每次都对 Stream 的每个元素进行转换,而且是执行多次,这样时间复杂度就是 N(转换次数)个 for 循环里把所有操作都做掉的总和吗?其实不是这样的,转换操作都是 lazy 的,多个转换操作只会在 Terminal 操作的时候融合起来,一次循环完成。我们可以这样简单的理解,Stream 里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在 Terminal 操作的时候循环 Stream 对应的集合,然后对每个元素执行所有的函数。

三、Stream类UML

Java8中的Stream

四、开发中常用示例

1:获取某一列的值

List<SkuNoMappingDTO> skuNoMappingDTOS = productServiceApiClient.checkExistSku(skuNos); if (null == skuNoMappingDTOS || skuNoMappingDTOS.isEmpty()) { return Collections.emptyList(); } Set<Long> skuIds=skuNoMappingDTOS.stream().map(f->f.getId()).collect(Collectors.toSet());

2:字符串转list

//01 List<String> orderNos = Arrays.stream(findInvoiceListParam.getOrder_ids().split(",")) .collect(Collectors.toList()); //02 List<Integer> messageTypes = new ArrayList<>(); String[] types = findMessageDTO.getType().split(","); messageTypes = Arrays.stream(types).map(Integer::valueOf).collect(Collectors.toList());

3:list转另外一个list

//01 List<UserInfo> pageList = userInfoService.list(queryWrapper); List<UserInfoExp> list = pageList.stream().map(e -> JSONUtil. toBean(JSONUtil.toJsonStr(e), UserInfoExp.class)). collect(Collectors.toList()); //02 List<OperateCard> operateCards = operateCard.selectList(new QueryWrapper<OperateCard>().lambda() .eq(OperateCard::getUserBaseId, userBaseId)); if (null != operateCards && operateCards.size() > 0) { return operateCards.stream().map(item -> { OperateCardDto operateCardDto = new OperateCardDto(); BeanUtils.copyProperties(item, operateCardDto); return operateCardDto; }).collect(Collectors.toList()); } else { return null; }

4:int[] 转 List

int[] userIds =new int[]{1,2,3}; List<Integer> list01 = Arrays.stream(userIds).boxed().collect(Collectors.toList()); List<Integer> list02 = IntStream.of(userIds).boxed().collect(Collectors.toList());

5:int[] 转 Integer[]

int[] userIds =new int[]{1,2,3}; Integer [] integers01=Arrays.stream(userIds).boxed().toArray(Integer[]::new);

6:List 转 Integer[]

List<Integer> list = new ArrayList<>(); Integer[] integers2 = list.toArray(new Integer[0]);

7:List 转 int[]

List<Integer> list = new ArrayList<>(); int[] intArray=list.stream().mapToInt(Integer::valueOf).toArray();

引用
1:IBM-Develop:https://developer.ibm.com/zh/articles/j-lo-java8streamapi/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywwzx.html