Java 8 Stream和对数组的操作

Bla*_*dor 191 java arrays java-8 java-stream

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

谢谢

dka*_*zel 288

添加了一些新方法java.util.Arrays将数组转换为Java 8流,然后可以将其用于求和等.

int sum =  Arrays.stream(myIntArray)
                 .sum();
Run Code Online (Sandbox Code Playgroud)

将两个数组相乘会稍微困难一些,因为我无法想到一种方法来获得与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]);
Run Code Online (Sandbox Code Playgroud)

编辑

评论者@Holger指出你可以使用这个map方法而不是forEach像这样:

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

  • `int [] result = IntStream.range(0,a.length).map(i-> a [i]*b [i]).toArray();` (12认同)
  • @Holger 是的,那也行。尽管您可能想使用 `mapToInt` 来避免装箱。 (2认同)
  • @dkatzel — 因为它已经是一个 IntStream,所以“map”需要一个 IntUnaryOperator,所以不涉及装箱。 (2认同)

Ian*_*ght 58

您可以使用以下命令将数组转换为流Arrays.stream():

int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);
Run Code Online (Sandbox Code Playgroud)

获得流后,您可以使用文档中描述的任何方法,例如sum()或者其他任何方法.你可以mapfilter通过调用lambda函数,相关数据流的方法在Python这样的:

Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);
Run Code Online (Sandbox Code Playgroud)

完成修改流后,然后调用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();
Run Code Online (Sandbox Code Playgroud)


San*_*Lee 9

如果你不得不处理大数字,要小心.

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

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

long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
Run Code Online (Sandbox Code Playgroud)


Raf*_*ael 5

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

看看为什么当从数组流式传输时不能将整数映射到字符串