Java 8 流 Map<K,V> 到 List<T>

2022-09-01 15:21:57

鉴于我有一些函数,它接受两个参数并返回一个值,是否可以将Map转换为流中的列表作为非终端操作?我发现的最接近的是在地图上使用 forEach 创建实例并将其添加到预定义的列表中,然后从该列表启动新的流。还是我只是错过了什么?

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

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

(现在我想流式传输该地图的条目集)

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

答案 1

您应该获取映射的 ,并将条目粘附到二进制函数的调用中:entrySet

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

上述结果是实例流。T

更新

您的附加示例确认了以下注释中讨论的内容:并且本质上是终端操作。它们必须完全执行才能产生输出的第一个元素,因此将它们作为非终端操作参与在性能/内存占用方面没有任何好处。group bysort

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


答案 2

您还可以使用以下技术将哈希映射条目转换为 ArrayList,

ArrayList list = hashMap.values();

推荐