【问题标题】:groupingBy to Collection Java8groupingBy 到 Collection Java8
【发布时间】:2015-04-09 02:11:54
【问题描述】:

我的方法是这样的:

 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>,而不是Map>。

我当然可以这样做:

   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 返回的地图类型。但是我不知道如何使用它。 有 Collectors.toCollection(),但我认为它仍然会返回 Collection 的一些实现,而不是 Collection 本身。

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

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

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

【问题讨论】:

  • 当然 toCollection 返回 Collection 的一些实现。 Collection 是一个接口,所以它没有实现。使用 toCollection 时,可以选择使用哪个实现,但返回类型为Collection
  • function::apply 传递给需要函数的方法是没有意义的。只需使用function...

标签: java generics collections lambda java-8


【解决方案1】:

这样的事情应该可以工作:

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)。

【讨论】:

  • 我知道您只是从问题中复制了它,但我建议在其他编码人员开始复制此代码片段之前将 function::apply 替换为 function,并且在另一个函数中无用的函数包装成为一种常见的比喻……
  • @Holger 完成。谢谢!
【解决方案2】:

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

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)));
}

【讨论】:

    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多