使用流分组Map <foo,list <bar>&gt;基于List <bar>的大小

时间:2016-06-20 23:05:11

标签: java java-8 java-stream collectors

我试图转换此格式的数据:

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

我想根据每个条目的List<Bar>的大小创建一个分组,这样在我的输出地图中,我会得到一个包含0个条形的所有Foo的列表,所有有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究竟是如何工作的,因为这给了我一个&#34; getValue()未定义类型Object&#34;错误。在某些地方,我猜失去了关于entrySet的类型信息?这让我想知道这不是最好的解决方法。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:6)

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

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

假设各种收集器的静态导入