Java11中泛型集合的Map

bq9c1y66  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(400)

这个问题在这里已经有答案了

将流收集回相同的收集类型(3个答案)
上个月关门了。
我一直在试图找到一种方法来编写泛型函数(可能不使用泛型)来Map集合。
假设我有一个a到b的函数,我想写一个取a的函数 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> 但我不知道如何找到一个供应商?
编辑:我希望能够以一种通用的方式使用这个函数:如果我传递一个集合,我得到一个集合作为回报,但是如果我传递一个列表,我得到一个列表作为回报。有可能这样做吗?

v440hwme

v440hwme1#

替换语句 Collectors.toCollection(() -> points)Collectors.toList() .
演示:

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

class Car {
    String name;

    public Car(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Car [name=" + name + "]";
    }
}

class Book {
    Car car;

    public Book(Car car) {
        this.car = car;
    }

    public Car getCar() {
        return car;
    }
}

public class Main {
    public static void main(String[] args) {
        // Test
        Collection<Car> list = points2dToPoints(
                List.of(new Book(new Car("Toyota")), new Book(new Car("Ford")), new Book(new Car("Suzuki"))));

        list.forEach(System.out::println);
    }

    public static Collection<Car> points2dToPoints(Collection<Book> points) {
        return points.stream().map(Book::getCar).collect(Collectors.toList());    
    }
}

输出:

Car [name=Toyota]
Car [name=Ford]
Car [name=Suzuki]
xmd2e60i

xmd2e60i2#

最好的选择是不要过于复杂,只需:

public static Collection<Point> points2dToPoints(Collection<Point2D> points) {
    return points.stream()
            .map(Utils::point2dToPoint)
            .collect(Collectors.toList());
}

返回接口的具体实现 Collection (例如。, Collectors.toList() )在隐藏实现细节的同时,(例如 Collection 在方法签名中)。
但是,您可以通过传递给您的方法使其更通用——如 Supplier --接口的具体实现是什么 Collection 你想要它回来,即

public static Collection<Point> points2dToPoints(Collection<Point2D> points, Supplier<Collection<Point>> aNew) {
        return points.stream()
                .map(Utils::point2dToPoint)
                .collect(toCollection(aNew));

这样你就可以通过混凝土 Collection 将返回的实现,例如:

points2dToPoints(.., ArrayList::new);
points2dToPoints(.., TreeSet::new);

相关问题