Java 8 Stream和对数组的操作

时间:2014-06-24 15:21:13

标签: java arrays java-8 java-stream

我刚刚发现了新的Java 8流功能。来自Python,我想知道现在是否有一种简洁的方法可以对数组进行操作,例如求和,以“一行pythonic”方式将两个数组相乘?

由于

4 个答案:

答案 0 :(得分:283)

java.util.Arrays的新方法将数组转换为Java 8流,然后可以用于求和等。

int sum =  Arrays.stream(myIntArray)
                 .sum();

将两个数组相乘会稍微困难一些,因为我无法想到一种方法来获取与Stream操作同时获得值和索引的方法。这意味着您可能必须流式传输数组的索引。

//in this example a[] and b[] are same length
int[] a = ...
int[] b = ...

int[] result = new int[a.length];

IntStream.range(0, a.length)
         .forEach(i -> result[i] = a[i] * b[i]);

修改

评论者@Holger指出您可以使用map方法代替forEach,如下所示:

int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();

答案 1 :(得分:56)

您可以使用Arrays.stream()

将数组转换为流
int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);

获得流后,您可以使用the documentation中描述的任何方法,例如sum()或其他任何方法。通过使用Lambda函数调用相关的流方法,您可以在Python中使用mapfilter

Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);

完成修改流后,您可以调用toArray()将其转换回数组以便在其他地方使用:

int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();

答案 2 :(得分:9)

如果你需要处理大量数字,请小心。

int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0

上述总和不是2 * Integer.MIN_VALUE。 在这种情况下你需要这样做。

long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct

答案 3 :(得分:3)

请注意,Arrays.stream(arr)创建一个LongStream(或IntStream,...)而不是Stream,因此map函数不能用于修改类型。这就是提供.mapToLong,mapToObject,...函数的原因。

查看why-cant-i-map-integers-to-strings-when-streaming-from-an-array