分组到 Collection Java8
groupingBy to Collection Java8
我的方法是这样的:
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));
}
然后它不起作用,因为分组是按 returns 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 returns .但是我不知道如何使用它。
有 Collectors.toCollection(),但我认为它仍会返回 Collection 的某些实现,而不是 Collection 本身。
也有可能编写我的自定义收集器,遵循此 link:
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
实例。如果您愿意,可以选择其他 collections(只需更改 ArrayList::new
)。
您可以提供收集器的类型以及地图的类型:
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)));
}
我的方法是这样的:
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));
}
然后它不起作用,因为分组是按 returns 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 returns .但是我不知道如何使用它。 有 Collectors.toCollection(),但我认为它仍会返回 Collection 的某些实现,而不是 Collection 本身。
也有可能编写我的自定义收集器,遵循此 link: 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
实例。如果您愿意,可以选择其他 collections(只需更改 ArrayList::new
)。
您可以提供收集器的类型以及地图的类型:
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)));
}