有一个整型二维数组:
int[][] arr = {{3, 4},{5, 6, 7},{10, -4, 7}};
我想求第一个元素的和:int sum = 3+5+10;我可以写:
int sum = 3+5+10;
int sum = 0; for (final int[] i : arr) sum += i[0];
但是我想不使用传统的 for 循环来求和。我试过减少:
Arrays.stream(arr).reduce(0, (a, b) -> a[0] + b[0])
但这并不奏效。
jdg4fx2g1#
试试这个。
import java.util.*; import java.util.stream.*; public class Main { public static void main(String[] args) { int[][] arr = {{3, 4},{5, 6, 7},{10, -4, 7}}; int x = Arrays.stream(arr).map(vec -> vec[0]).reduce(0, Integer::sum); System.out.println(x); } }
物流(arr):获取数组的数组并返回数组的数组流。.map(vec -〉vec[0]):取括号中的lambda并对流中的每个元素执行它,将结果Map到输出流中(它是一个适配器)。在这个特定的lambda中,我们取数组并输出第一个元素。.reduce(0,整数::和):它是流的最终消费者(也称为收集器)。接受一个收集器函数(在本例中为sum),以便流中的所有元素都被收集到一个从值0(第一个参数)开始的求和变量中。
frebpwbc2#
这里的问题是:
reduceMap器接受一个二维数组,并期望返回一个数组,但您返回的是一个int。所以另一个解决方法是这样的:
Arrays.stream(arr).mapToInt(a -> a[0]).sum()
首先,我将int ArrayMap为int(数组的第一个元素),然后使用该流的和。您可以查看Oracle提供的有关流API的免费教程:https://dev.java/learn/the-stream-api/
k3fezbri3#
正如我在注解中解释的,由于0[0]无效,因此将0作为a的初始值传递是无效的,因此您的代码是错误的。你可以这样做:Arrays.stream(arr).reduce(new int[] {0}, (a, b) -> new int[]{a[0] + b[0] })[0];它将二维数组缩减为具有一个表示总和的元素的一维数组,然后打印其第一个元素。
0[0]
0
a
Arrays.stream(arr).reduce(new int[] {0}, (a, b) -> new int[]{a[0] + b[0] })[0];
jhdbpxl94#
首先,因为有不同大小的子数组,所以需要确保索引为0的元素存在,这意味着该数组不为空,否则可能会得到ArrayIndexOutOfBoundsException。其次,这里不需要使用reduce。在Stream API中,我们有几种专门的归约形式,获取 primitive stream 元素的sum的操作被表示为sum()操作(当然,可以使用reduce()来实现,但这会使代码变得不必要的冗长和缺乏表达力)。另外,请注意,在将每个子数组的第一个元素相加时,可能会遇到 * 整数溢出 *。为了避免这种情况,如果对输入没有明确的约束,则可以求助于LongStream。
ArrayIndexOutOfBoundsException
reduce
sum()
reduce()
LongStream
int[][] arr = {{3, 4},{5, 6, 7},{10, -4, 7}}; long sum = Arrays.stream(arr) .filter(a -> a.length > 0) .mapToLong(a -> a[0]) .sum();
4条答案
按热度按时间jdg4fx2g1#
试试这个。
物流(arr):获取数组的数组并返回数组的数组流。
.map(vec -〉vec[0]):取括号中的lambda并对流中的每个元素执行它,将结果Map到输出流中(它是一个适配器)。在这个特定的lambda中,我们取数组并输出第一个元素。
.reduce(0,整数::和):它是流的最终消费者(也称为收集器)。接受一个收集器函数(在本例中为sum),以便流中的所有元素都被收集到一个从值0(第一个参数)开始的求和变量中。
frebpwbc2#
这里的问题是:
reduceMap器接受一个二维数组,并期望返回一个数组,但您返回的是一个int。
所以另一个解决方法是这样的:
首先,我将int ArrayMap为int(数组的第一个元素),然后使用该流的和。
您可以查看Oracle提供的有关流API的免费教程:https://dev.java/learn/the-stream-api/
k3fezbri3#
正如我在注解中解释的,由于
0[0]
无效,因此将0
作为a
的初始值传递是无效的,因此您的代码是错误的。你可以这样做:
Arrays.stream(arr).reduce(new int[] {0}, (a, b) -> new int[]{a[0] + b[0] })[0];
它将二维数组缩减为具有一个表示总和的元素的一维数组,然后打印其第一个元素。
jhdbpxl94#
首先,因为有不同大小的子数组,所以需要确保索引为
0
的元素存在,这意味着该数组不为空,否则可能会得到ArrayIndexOutOfBoundsException
。其次,这里不需要使用
reduce
。在Stream API中,我们有几种专门的归约形式,获取 primitive stream 元素的sum的操作被表示为
sum()
操作(当然,可以使用reduce()
来实现,但这会使代码变得不必要的冗长和缺乏表达力)。另外,请注意,在将每个子数组的第一个元素相加时,可能会遇到 * 整数溢出 *。为了避免这种情况,如果对输入没有明确的约束,则可以求助于
LongStream
。