Java 8流将<k,v>映射到List <t> </t> </k,v>

时间:2014-01-20 11:45:19

标签: java lambda java-8 java-stream

鉴于我有一些函数需要两个参数并返回一个值,是否可以将Map转换为Stream中的List作为非终端操作? 最近的I cam找到的是在地图上使用forEach来创建实例并将它们添加到预定义的List中,然后从该List开始一个新的Stream。或者我错过了什么?

例如:经典“在一些长词中找到3个最常出现的单词”

wordList.stream().collect(groupingBy(Function.identity, Collectors.counting))).

(现在我想流式传输该地图的entrySet)

sorted((a,b) -> a.getValue().compareTo(b.getValue))).limit(3).forEach(print...

1 个答案:

答案 0 :(得分:53)

您应该获取地图的entrySet并将条目粘贴到二进制函数的调用中:

inputMap.entrySet().stream().map(e->myFun(e.getKey(),e.getValue()));

以上结果是T个实例的流。

更新

您的其他示例确认了以下评论中讨论的内容:group bysort是其性质终端操作。它们必须以完整执行才能生成输出的第一个元素,因此将它们作为非终端操作进行处理并不会在性能/内存占用方面产生任何影响。

恰好Java 8将sorted定义为非终端操作,但是该决定可能会导致欺骗性代码,因为操作将阻塞,直到它收到所有上游元素,并且必须保留它们接收。