gpt4 book ai didi

java - groupingBy 到集合 Java8

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:15 26 4
gpt4 key购买 nike

我的方法是这样的:

 public static <T, E>  Map<E, List<T>> groupBy(Collection<T> collection, Function<T, E> function){
return collection.stream().collect(Collectors.groupingBy(function::apply));
}

它有效,但我希望我的方法看起来像这样:

public static <T, E>  Map<E, Collection<T>> groupBy(Collection<T> collection, Function<T, E> function){
return collection.stream().collect(Collectors.groupingBy(function::apply));
}

然后它不起作用,因为 groupingBy 返回 Map < E, List< T>>,而不是 Map < E, Collection< T>>。

我当然可以这样做:

   public static <T, E>  Map<E, Collection<T>> groupBy(Collection<T> collection, Function<T, E> function){
return (Map<E, Collection<T>>) (Map) collection.stream().collect(Collectors.groupingBy(function::apply));
}

但我不喜欢这个解决方案。还有方法声明:

    public static <T, E>  Map<E, Collection<T>> groupBy(Collection<T> collection, Function<T, E> function)

必须保持这种状态(这是任务的一部分)。那么有没有比类型转换更好的解决方案呢?我知道 groupingBy 有第二个版本,它采用 Collector 作为第二个参数,它可以更改 groupingBy 返回的 map 类型。但是我不知道如何使用它。有 Collectors.toCollection(),但我认为它仍将返回 Collection 的一些实现,而不是 Collection 本身。

也可以通过以下链接编写我的自定义收集器: http://www.nurkiewicz.com/2014/07/introduction-to-writing-custom.html

但我不知道如何将它与 Collection 一起使用。

非常感谢您的帮助,谢谢 :)

最佳答案

像这样的东西应该可以工作:

public static <T, E>  Map<E, Collection<T>> groupBy(Collection<T> collection, Function<T, E> function){
return collection.stream()
.collect(Collectors.groupingBy(function,
Collectors.toCollection(ArrayList::new)));
}

这将为 Map 中的每个值生成一个 ArrayList 实例。您可以根据需要选择其他集合(只需更改 ArrayList::new)。

关于java - groupingBy 到集合 Java8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28408060/

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