我的方法如下所示:
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,作为第二个参数,它采用收集器,它可以改变groupingBy返回的映射的类型。但是我不知道怎么用它。有Collectors.toCollection(),但我认为它仍将返回Collection的一些实现,而不是Collection本身。
也有可能编写我的自定义收集器,遵循以下链接:http://www.nurkiewicz.com/2014/07/introduction-to-writing-custom.html
但我不知道如何将它与收藏一起使用。
我非常感谢你的帮助,谢谢:)
发布于 2015-02-09 11:00:48
像这样的事情应该有效:
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)。
发布于 2015-02-09 11:12:03
您可以提供收集器的类型以及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)));
}https://stackoverflow.com/questions/28408060
复制相似问题