java 多次对流中的值求和

zlwx9yxi  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(120)

我正在寻找一个使用流的问题的解决方案:
我有一个样本列表:
List.of(1,3,5,7)
我想添加一个给定的元素与流中的每个下一个元素即。
1+3+5+7
3+5+7
5+7
最后把结果加起来并返回。在这种情况下,结果将是43。
这是合理可行的,还是使用for循环更好?

daupos2t

daupos2t1#

这是合理可行的,还是使用for循环更好?
是的,有可能。循环可能会更有效,因为流会产生一些开销。但是流的思想是提供声明式编程技术(做什么)来完成一些应该比命令式编程(如何做)更明显的事情。
有几种方法。Holger提供的这个流解决方案在线性时间内工作。它遍历列表,对每个项在最终总和中出现的次数求和。因为它还对列表中最后一个被减去的条目(这是不希望的)求和。

List<Integer> list = List.of(1,3,5,7);

int sum = IntStream.range(0, list.size())
      .map(i -> list.get(i) * (i + 1))
      .sum() - list.get(list.size() - 1);

System.out.println(sum);

指纹

43

下面是一个使用相同算法的循环版本。

int sum = 0;
for (int i = 0; i < list.size(); i++) {
    sum += list.get(i)*(i+1);
}
sum -= list.get(list.size()-1);

虽然循环版本可能更有效,但这是一个相当琐碎的情况,解决方案实际上是相同的。复杂的软件可能更适合声明式编码风格。
使用混合解决方案还有其他的考虑,比如使用与java 8+增强一致的循环(想到Map interface)。
所采取的方法可能取决于诸如提高编写软件的生产力以及能够诊断一年或更长时间内未看到的代码中的问题之类的事情。

ruarlubt

ruarlubt2#

您可以使用 * IntStream * 类来编译 List,类似于 for-loop
这里有一个例子。

List<Integer> list = List.of(1,3,5,7);
int sum
    = IntStream.range(0, list.size() - 1)
               .map(x -> list.stream().skip(x)
                                      .mapToInt(y -> y)
                                      .sum())
               .sum();

相关问题