【问题标题】:Multiply & Sum two ArrayLists in Java8在 Java 8 中将两个 ArrayList 相乘和相加
【发布时间】:2015-06-28 02:32:06
【问题描述】:

我有两个大小相等的 ArrayList,分别命名为 A 和 B,其中包含一些数字。现在我想计算这样的东西:

int sum = 0;
for(int i=0; i<A.size() && i<B.size(); i++) {
  sum += A.get(i)*B.get(i);
}

如何在不使用任何额外的用户定义方法的情况下使用 Java 8 功能(流、lambda 表达式等)来计算总和?

【问题讨论】:

  • 如果您解释为什么循环不被您接受,您可能会得到更好的答案,但您可以使用 IntStream.range(0, A.size()).map(i -&gt; A.get(i) * B.get(i)).sum() 的循环的相当字面意思的流翻译。
  • 只是为了良好的编程测量:我没有看到任何证据表明 A 和 B 的大小相同。
  • @JeffreyBosboom 我对使用循环没有任何问题。我问它是因为我正在学习 Java 8 功能,应该在帖子中包含它。

标签: java java-8 java-stream


【解决方案1】:
int sum = 
    IntStream.range(0, min(a.size(), b.size())
             .map(i -> a.get(i) * b.get(i))
             .sum();

【讨论】:

  • 我认为是乘法,而不是加法。 a.get(i) + b.get(i) 应该是 a.get(i) * b.get(i)?
  • 这是一个很好的解决方案。我没有考虑将索引范围作为流发出。
  • @Mubin - 对于任何支持位置访问的集合,它将“按原样”工作。
  • @Mubin IntStream.range 生成索引流,而不是要相乘的值流。无论包含的类型如何,所有列表都可以通过整数索引进行索引。
  • 对于使用ArrayListsDouble 值,我必须使用mapToDouble 而不是map,否则它会给出Type mismatch: cannot convert from double to int
【解决方案2】:
int sum = IntStream
            .range(0, min(a.size(), b.size())
            .map(i -> 
              (a.get(i).getValue() == null || b.get(i).getValue() == null) ? 0 :
                       (a.get(i).getValue() * b.get(i).getValue()))
            .sum();

完美的解决方案!
我有类似的要求,我添加了三元运算符空检查。 (在我的场景中,我列出了泛型类型和计算是在对象中可能为空的值上完成的)

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 2010-10-01
    • 2018-05-10
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多