我正在尝试转换这种格式的数据:
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/