Java Streams API在索引处对列表求和

5
我想知道是否有更有效的方法来汇总所有的三个列表 - 即将它们在相同索引处的值相加。
我之所以这样问,是因为使用Streams API,可能可以使其更通用,并适用于任意数量的列表。
List<Double> listA = getListA();
List<Double> listB = getListB();
List<Double> listC = getListC();

int listsSize = listA.size();

    List<?> collect = IntStream.range(0, listsSize)
            .mapToObj(i -> listA.get(i) + listB.get(i) + list(C).get(i))
            .collect(toList());

感谢您的见解。

你还想用它来做什么 - 所有的“数字”? - ChiefTwoPencils
@ChiefTwoPencils 是的,你说得对,我只是忽略了那个显而易见的问题,我已经进行了编辑,这个问题仍然适用于任何数量的列表,谢谢。 - dotmindlabs
@sodik 我的意思是对于任何数量的列表,如果我有100个列表,使用从范围中的索引并获取它们的值100次似乎有些过度。 - dotmindlabs
1个回答

5
这个怎么样?
List<List<Double>> lists = ...;

// ensure all lists are same size, and get size
int[] sizes = lists.stream().mapToInt(List::size).distinct().toArray();
if (sizes.length != 1)
    throw ...
int size = sizes[0];

double[] sums =
    IntStream.range(0, size)
             .mapToDouble(i -> lists.stream().mapToDouble(list -> list.get(i)).sum())
             .toArray();

小错误,应该是 lists.stream().mapToInt(...)。 :-) 另外,你能不能用 .distinct().limit(2) 让它更高效一些,这样只要找到超过两个不同的尺寸就停止计算? - user2336315
2
@user2336315 修正了拼写错误。你提出的“限制”建议可以,但说实话我不会费心去做;额外的“成本”只会在你即将抛出异常之前才会出现。在将要失败的路径上进行小优化很少值得增加复杂性。 - Brian Goetz

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