BinaryOpertor for List<Integer> 添加列表

BinaryOpertor for List<Integer> to add the lists

在我之前问过的上一个问题中

现在我试图添加到 List<Integer> 而不仅仅是两个 整数 ab,这样每个索引都添加到另一个列表的相同索引。

我之前

 BinaryOperator<Integer> binaryOperator = Integer::sum;

使用 binaryOperator.apply(int a,int b) 将两个整数相加。有没有类似的方式

BinaryOperator<List<Integer>> binaryOperator = List<Integer>::sum;

然后在List<Integer> cList?

中得到结果

您可以使用 IntStream.range() 遍历元素,然后 mapToObj() 将它们映射到它们的总和,然后 collect() 它们在第三个列表中。

假设您的列表大小相同

List<Integer> first = List.of(); // initialised
List<Integer> second = List.of(); // initialised

您可以获得第三个列表:

List<Integer> third = IntStream.range(0, first.size())
                               .mapToObj(i -> first.get(i) + second.get(i))
                               .collect(Collectors.toList());

就 BinaryOperator 而言,您可以将其表示为:

BinaryOperator<List<Integer>> listBinaryOperator = (a, b) -> IntStream.range(0, first.size())
            .mapToObj(i -> first.get(i) + second.get(i))
//          OR from your existing code
//          .mapToObj(i -> binaryOperator.apply(first.get(i), second.get(i)))
            .collect(Collectors.toList());

或者您可以通过将逻辑抽象成一个方法并将其用作:

使其更具可读性
BinaryOperator<List<Integer>> listBinaryOperator = YourClass::sumOfList;

其中 sumOfList 定义为:

private List<Integer> sumOfList(List<Integer> first, List<Integer> second) {
    return IntStream.range(0, first.size())
            .mapToObj(i -> first.get(i) + second.get(i))
            .collect(Collectors.toList());
}

如果你想对相应索引处的元素执行一些计算(在这种特定情况下是求和),则无需使用 BinaryOperator,而是使用 IntStream.range 来生成索引:

// generates numbers from 0 until list.size exclusive 
IntStream.range(0, list.size())....

// generates numbers from 0 until the minimum of the two lists exclusive if needed
IntStream.range(0, Math.min(list.size(), list2.size()))....

这种逻辑的通用名称是"zip";即,当给定两个输入序列时,它会产生一个输出序列,其中使用某个函数将输入序列中位于同一位置的每两个元素组合在一起。

标准库中没有为此内置的方法,但您可以找到一些通用实现 here

例如,使用链接 post 的已接受答案中的 zip 方法,您可以简单地执行:

List<Integer> result = zip(f.stream(), s.stream(), (l, r) -> l + r).collect(toList());

或使用方法参考:

List<Integer> result = zip(f.stream(), s.stream(), Math::addExact).collect(toList());

其中 fs 是您的整数列表。

您可以定义自己的实用程序方法,其唯一任务是压缩 两个输入列表:

<T> List<T> zip(final List<? extends T> first, final List<? extends T> second, final BinaryOperator<T> operation)
{
    return IntStream.range(0, Math.min(first.size(), second.size()))
        .mapToObj(index -> operation.apply(first.get(index), second.get(index)))
        .collect(Collectors.toList());
}

这样,您可以将两个输入列表相加为:

zip(first, second, Integer::sum)