java - 使用流根据 List<Bar> 的大小对 Map<Foo,List<Bar>> 进行分组

标签 java java-8 java-stream collectors

我正在尝试转换这种格式的数据:

Map<Foo, List<Bar>> mapFooToBars;         //start Map
Map<Integer, List<Foo>> mapListSizeToFoos //destination Map

我想根据 List<Bar> 的大小创建一个分组对于每个条目,因此在我的输出映射中,我将有一个列表,其中包含所有具有 0 个条的 Foos,所有具有 1 个条的 Foos,等等。

我正在尝试这样做:

Map<Foo, List<Bar>> fooBarMap = whatever();
fooBarMap.entrySet().stream()
    .collect(Collectors.groupingBy(entry -> entry.getValue().size()));
//expected Map<Integer,Entry<Foo, List<Bar>> which
//could be transformed into Map<Integer,Foo> pretty easily

我显然不清楚 groupingBy 的确切工作原理,因为这给我一个“getValue() undefined object 类型”错误。我猜在某个地方丢失了关于 entrySet 的类型信息?这让我想知道这是否不是解决此问题的最佳方法。任何帮助表示赞赏!

最佳答案

您走在正确的轨道上。您应该使用 groupingBy 但将 mapping(Map.Entry::getKey, toList()) 作为第二个参数。这会将键收集到一个列表中,这些列表将是生成的映射的值。

fooBarMap.entrySet().stream()
    .collect(groupingBy(
        e -> e.getValue().size(),
        mapping(Map.Entry::getKey, toList())
    ));

以上假定各种收集器的静态导入

关于java - 使用流根据 List<Bar> 的大小对 Map<Foo,List<Bar>> 进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37933169/

相关文章:

java - 使用流从对象列表中包含的数组检索类型时出错

java - "instanceof Void"总是返回 false 吗?

Java 8 : how to derive a ZoneId from ZoneOffset

java - 无法使用 Java 10.0.1 运行 Eclipse

java - 如何通过流计算值

java-8 - 为什么JDK中的Optional类以非常基本的方式实现Singleton

java - 对自定义类 arraybuffer 进行排序并获取 scala 中的子集

java - 从 Java 8 流中以最大频率获取对象

java - 如何让方法返回多个对象?

java - 如何修复错误: Unnecessarily replacing a task that does not exist has been deprecated