java - 收集 Map<K,V> 到 Map<K,List<V>> 的流

标签 java java-8 java-stream collectors

我有一个 Stream< Map< K, V > >我正在尝试将这些 map 合并在一起,但在列表中保留重复值,因此最终类型将是 Map< K, List<V> > .有没有办法做到这一点?我知道 toMap收集器有一个二元函数来基本上选择返回哪个值,但它能跟踪转换后的列表吗?

如果aStream< Map< String, Int > >

a.flatMap(map -> map.entrySet().stream()).collect(
    Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (val1, val2) -> ??
);

最佳答案

使用groupingBy : 请参阅 javadoc,但在您的情况下应该是这样的:

a.flatMap(map -> map.entrySet().stream())
 .collect(
   Collectors.groupingBy(
     Map.Entry::getKey, 
     HashMap::new, 
     Collectors.mapping(Map.Entry::getValue, toList())
   )
);

或者:

a.map(Map::entrySet).flatMap(Set::stream)
 .collect(Collectors.groupingBy(
     Map.Entry::getKey, 
     Collectors.mapping(Map.Entry::getValue, toList())
   )
);

关于java - 收集 Map<K,V> 到 Map<K,List<V>> 的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602519/

相关文章:

java - 除了节省代码行之外,lambda 表达式还有其他用途吗?

java - 如何将以下代码转换为流

Java 8 替代 Map.entry() 将值映射到新 Map?

Java计算器将数字添加到文本字段

java - Android 异步任务已弃用。需要替代示例

java - 是什么原因导致 javax.xml.transform.* 中的 fatal error 、错误和警告

java - 从 SD 卡加载绘图

java - 在流中使用 Java 8 Supplier 实现惰性求值

java - sparkjava和eclipse Unresolved 编译问题:

Java Stream API 延迟计算内部结构