【发布时间】:2020-11-27 20:18:50
【问题描述】:
我一直在尝试找到一种方法来编写泛型函数(可能不使用泛型)来映射集合。
假设我有一个函数 A 到 B,我想编写一个函数,它接受 Collection<A> 并返回 Collection<B>。注意 A 和 B 不是泛型,只是表达一般模式的一种方式。
到目前为止我所拥有的是
public static Collection<Point> points2dToPoints(Collection<Point2D> points) {
return points.stream()
.map(Utils::point2dToPoint)
.collect(Collectors.toCollection(() -> points));
}
但是,我在 .collect 中遇到类型错误,因为显然我希望新集合为 Collection<Point>,但我不确定如何为此获取供应商?
编辑:我希望能够以通用方式使用此函数:如果我将它传递给一个 Set 我会得到一个 Set 作为回报,但如果我将它传递一个 List 我会得到一个列表作为回报。甚至有可能做到这一点吗?
【问题讨论】:
-
只需使用
Collectors.toList()。 -
@LouisWasserman 如果我不知道它是否是一个列表怎么办?我希望能够传递给它一个集合,并得到一个集合作为回报,但是当我传递一个列表时,我得到一个列表
-
这是一个需要指定的重要细节。一般来说,不可能解决这个问题:你不能保证你得到的集合类型甚至可以由其他代码创建。您所能做的就是尝试捕捉常见情况:
if (points instanceof Set) { // use toSet... }
标签: java generics collections java-11