【发布时间】: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
我当然可以这样做:
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