很容易将 List<V>
转换为 Map<K, List<V>>
。例如:
public Map<Integer, List<String>> getMap(List<String> strings) {
return
strings.stream()
.collect(Collectors.groupingBy(String::length));
}
但我想用我自己的 List
和 Map
供应商 来做。
我想出了这个:
public Map<Integer, List<String>> getMap(List<String> strings) {
return strings.stream()
.collect(Collectors.toMap(
String::length,
item -> {List<String> list = new ArrayList<>(); list.add(item); return list;},
(list1, list2) -> {list1.addAll(list2); return list1;},
HashMap::new));
}
问题: 是否有更简单、更简洁或更有效的方法?例如,像这样的东西(不起作用):
return strings.stream()
.collect(Collectors.toMap(
String::length,
ArrayList::new,
HashMap::new));
如果我只需要定义 List
供应商,而不是 Map
供应商怎么办?
原文由 MarcG 发布,翻译遵循 CC BY-SA 4.0 许可协议
你可以有以下内容:
收集器
groupingBy(classifier, mapFactory, downstream)
可用于指定需要哪种类型的地图,方法是将所需地图的供应商传递给mapFactory
。然后,用于收集分组到同一键的元素的下游收集器是toCollection(collectionFactory)
,它能够收集到从给定供应商获得的集合中。这确保返回的地图是
HashMap
并且每个值中的列表是ArrayList
。请注意,如果您想要返回 map 和 collection 的特定实现,那么您很可能希望该方法也返回这些特定类型,因此您可以使用它们的属性。如果您只想指定一个集合供应商,并保留
groupingBy
默认地图,您可以在上面的代码中省略供应商并使用 两个参数重载:作为旁注,你可以有一个通用的方法:
The advantage with this declaration is that you can now use it to have specific
HashMap
ofArrayList
s as result, orLinkedHashMap
ofLinkedLists
s,如果调用者希望:但是,到那时,直接在代码中使用
groupingBy
可能会更简单……