Java 8 如何将一个 BiFunction 应用到两个不同对象的列表中?

4

我需要知道如何将一个BiFunction应用于两个不同对象的列表。

List<A> listA;
List<B> listB;

private BiFunction<A,B,C> biFunction=new BiFunction<A,B,C>() {
    @Override
    public C apply(A a, B b) {
        C c=new C();

        return c;
    }
};

我需要获取一个 List<C>,为此我必须使用 biFunctionlistAlistB

我不知道如何在Java 8中实现这一点,我唯一知道的方式是这样的:

List<C> listC=new ArrayList<>();
        for(int i=0;i<listA.size();i++)
            listC.add(biFunction.apply(listA.get(i),listB.get(i)));

显然,listAlistB的大小相同。
这是一个可怕的解决方案,请你能提出更好的方法吗?

我不相信在不使用外部库的情况下存在更好的解决方案。 - Louis Wasserman
2个回答

8
据我所知,不使用外部库的最干净的方法是这样的:
List<A> listA;
List<B> listB;

BiFunction<A, B, C> biFunction = (a, b) -> {
    C c = new C();
    return c;
};

List<C> listC = IntStream.range(0, listA.size())
        .mapToObj(i -> biFunction.apply(listA.get(i), listB.get(i)))
        .collect(Collectors.toList());

1
使用protonpack中的StreamUtils
Stream<C> streamC = StreamUtils.zip(listA, listB, biFunction);

它是开源的,所以不要犹豫,去看一下。


1
StreamUtils.zip 不会压缩列表,它只能压缩流,因此您应该像这样使用它:StreamUtils.zip(listA.stream(), listB.stream(), biFunction)。另外需要注意的是,与 @HelderPereira 的解决方案不同,这个版本不支持并行处理。 - Tagir Valeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接