gpt4 book ai didi

java - 如何使用 Java 8 流和自定义 List 和 Map 供应商将 List 转换为 Map>?

转载 作者:IT老高 更新时间:2023-10-28 20:40:56 25 4
gpt4 key购买 nike

转换很容易 List<V>进入 Map<K, List<V>> .例如:

public Map<Integer, List<String>> getMap(List<String> strings) {
return
strings.stream()
.collect(Collectors.groupingBy(String::length));
}

但我想用我自己的 ListMap 供应商

我想出了这个:

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供应商?

最佳答案

你可以有以下:

public Map<Integer, List<String>> getMap(List<String> strings) {
return strings.stream().collect(
Collectors.groupingBy(String::length, HashMap::new, Collectors.toCollection(ArrayList::new))
);
}

Collection 家groupingBy(classifier, mapFactory, downstream)可用于指定需要哪种类型的 map ,方法是向其传递 mapFactory 所需 map 的供应商。然后,用于收集分组到同一键的元素的下游收集器是toCollection(collectionFactory) ,这使得能够收集到从给定供应商处获得的集合中。

这确保返回的映射是一个HashMap,并且每个值中的列表都是ArrayList。请注意,如果您想要返回 map 和 collection 的特定实现,那么您很可能希望该方法也返回这些特定类型,以便您可以使用它们的属性。

如果你只想指定一个集合供应商,并保持 groupingBy 默认映射,你可以在上面的代码中省略供应商并使用 two arguments overload :

public Map<Integer, List<String>> getMap(List<String> strings) {
return strings.stream().collect(
Collectors.groupingBy(String::length, Collectors.toCollection(ArrayList::new))
);
}

作为旁注,您可以有一个通用方法:

public <K, V, C extends Collection<V>, M extends Map<K, C>> M getMap(List<V> list,
Function<? super V, ? extends K> classifier, Supplier<M> mapSupplier, Supplier<C> collectionSupplier) {
return list.stream().collect(
Collectors.groupingBy(classifier, mapSupplier, Collectors.toCollection(collectionSupplier))
);
}

此声明的优点是您现在可以使用它来获得 ArrayList 的特定 HashMap 作为结果,或 LinkedHashMapLinkedListss,如果调用者愿意的话:

HashMap<Integer, ArrayList<String>> m = getMap(Arrays.asList("foo", "bar", "toto"),
String::length, HashMap::new, ArrayList::new);
LinkedHashMap<Integer, LinkedList<String>> m2 = getMap(Arrays.asList("foo", "bar", "toto"),
String::length, LinkedHashMap::new, LinkedList::new);

但是,到那时,在代码中直接使用 groupingBy 可能会更简单...

关于java - 如何使用 Java 8 流和自定义 List 和 Map 供应商将 List<V> 转换为 Map<K、List<V>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40772997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com