首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >groupingBy to Collection Java8

groupingBy to Collection Java8
EN

Stack Overflow用户
提问于 2015-02-09 10:53:34
回答 2查看 1.7K关注 0票数 3

我的方法如下所示:

代码语言:javascript
复制
 public static <T, E>  Map<E, List<T>> groupBy(Collection<T> collection, Function<T, E> function){
    return collection.stream().collect(Collectors.groupingBy(function::apply));
}

但我想让我的方法看起来像这样:

代码语言:javascript
复制
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>>。

我当然可以这样做:

代码语言:javascript
复制
   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));
}

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

代码语言:javascript
复制
    public static <T, E>  Map<E, Collection<T>> groupBy(Collection<T> collection, Function<T, E> function)

必须保持这种状态(这是任务的一部分)。那么,还有比铸造更好的解决方案吗?我知道有第二个版本的groupingBy,作为第二个参数,它采用收集器,它可以改变groupingBy返回的映射的类型。但是我不知道怎么用它。有Collectors.toCollection(),但我认为它仍将返回Collection的一些实现,而不是Collection本身。

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

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

我非常感谢你的帮助,谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-09 11:00:48

像这样的事情应该有效:

代码语言:javascript
复制
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)));
}

这将为ArrayList中的每个值生成一个Map实例。如果愿意,可以选择其他集合(只需更改ArrayList::new)。

票数 4
EN

Stack Overflow用户

发布于 2015-02-09 11:12:03

您可以提供收集器的类型以及Map的类型:

代码语言:javascript
复制
public static <T, E> Map<E, Collection<T>> groupBy(Collection<T> collection, Function<T, E> function){
    return collection.stream().collect(Collectors.groupingBy(function::apply, HashMap::new,Collectors.toCollection(ArrayList::new)));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28408060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档