java - Java8 Streams:如何保留map之前的值以供collect / groupingBy函数访问
问题描述
我正在使用 Java8 Streams 遍历一个列表以及我调用的每个元素map
,然后我需要聚合结果。我的问题是,当我打电话时,groupingBy
我还需要在调用之前访问原始对象map
。这是一个片段:
list.stream() //
.filter(item -> item.getType() == HUMAN) //
.map(item -> manager.itemToHuman(item.getId())) //
.filter(Objects::nonNull) //
.collect(Collectors.groupingBy(Human::getAge, Collectors.summarizingLong(item.getCount())));
问题在于调用,Collectors.summarizingLong(item.getCount())
因为item
此时无法访问。有没有一种优雅的方法来克服这个问题?
解决方案
在进行map()
流转换后Stream<Human>
,您不能item
在收集器中使用对象。
您可以转换item
成一对Human
对象并在收集器上count
使用SimpleEntry
然后使用它。
list.stream()
.filter(item -> item.getType() == HUMAN)
.map(item ->
new AbstractMap.SimpleEntry<>(manager.itemToHuman(item.getId()), item.getCount()))
.filter(entry -> Objects.nonNull(entry.getKey()))
.collect(Collectors.groupingBy(entry -> entry.getKey().getAge(),
Collectors.summarizingLong(Map.Entry::getValue)));
推荐阅读
- javascript - 我应该如何将滚轮或滚动事件从一个元素转移到另一个元素?
- sql - SQL查询以获取子计数并将其求和
- firebase - Firebase - 创建一个临时用户,直到用户注册
- python - 根据列值将大型 csv 拆分为较小的 csv 文件,最终在较小的文件中出现空白
- c# - 正则表达式仅选择具有一致标题的字符串中的最后一个单词
- javascript - 基于 React 的 Chrome 扩展 - 未经检查的 runtime.lastError:无法建立连接。接收端不存在
- c - 构建找不到 Stdio.h 但我可以...?
- google-play-games - 为什么我的游戏未发布版本无法登录 Google Play 游戏?
- wordpress - 如何保存我的 Wordpress 网站的当前外观,以便恢复到旧版本?
- java-native-interface - 使用新的 java 包装器向 linphone 添加新的本机函数