Java 8流将<K,V>映射到List <T>

Jam*_*ill 23 java lambda java-8 java-stream

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

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

wordList.stream().collect(groupingBy(Function.identity, Collectors.counting))).
Run Code Online (Sandbox Code Playgroud)

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

sorted((a,b) -> a.getValue().compareTo(b.getValue))).limit(3).forEach(print...
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 53

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

inputMap.entrySet().stream().map(e->myFun(e.getKey(),e.getValue()));
Run Code Online (Sandbox Code Playgroud)

以上结果是一组T实例.

更新

您的其他示例确认了以下评论中讨论的内容:group by并且sort本质上是终端操作.他们必须进行完全能够产生均匀的输出的第一要素,所以涉及它们作为非终端操作不买在性能/内存占用方面的东西.

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

  • 答案中的代码采用*map*并生成`T`实例流.任何地方都没有列表的痕迹. (2认同)
  • 你拿一个entrySet的流 - 是的,我明白了.但是如果在流的中间创建Map(即通过收集),我怎么做呢?我想将k,v条目转换为单一类型的流并继续处理流中的那些? (2认同)
  • 如果你需要确保对的唯一性,那么在流中涉及一个`distinct()`步骤. (2认同)