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中一样map
或filter
:
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