Java 8stream和arrays上的操作

我刚刚发现了新的Java 8streamfunction。 来自Python,我想知道现在是否有一个简单的方法来做像求和这样的数组操作,将两个数组以“一行pythonic”的方式相乘?

谢谢

有一些新的方法被添加到java.util.Arrays以将数组转换成Java 8stream,然后可以用于求和等。

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

乘以两个数组有点难度,因为我想不出一种方法来获取值和索引在一个stream操作同时。 这意味着你可能必须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(); 

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

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

一旦你有了stream,你可以使用文档中描述的任何方法,比如sum()或其他。 通过使用Lambda函数调用相关的stream方法,可以像在Python中一样mapfilter

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

一旦完成stream的修改,然后调用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(); 

如果你必须处理大量的数据,请小心。

 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 

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

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