我试图转换此格式的数据:
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的类型信息?这让我想知道这不是最好的解决方法。任何帮助表示赞赏!
答案 0 :(得分:6)
你走在正确的轨道上。您应该使用groupingBy
但mapping(Map.Entry::getKey, toList())
作为第二个参数。这会将密钥收集到列表中,这些列表将是生成的映射的值。
fooBarMap.entrySet().stream()
.collect(groupingBy(
e -> e.getValue().size(),
mapping(Map.Entry::getKey, toList())
));
上面的假设各种收集器的静态导入