我刚刚发现了新的Java 8流功能。来自Python,我想知道现在是否有一种简洁的方法来对数组进行操作,比如求和,以“一行Python”的方式将两个数组相乘?
谢谢
java.util.Arrays中添加了新的方法,可以将数组转换为Java 8流,然后用于求和等。
java.util.Arrays
int sum = Arrays.stream(myIntArray).sum();
相乘两个数组有点困难,因为我想不出一种方法来获得值和索引在同一时间流操作。这意味着您可能需要遍历数组的索引。
//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:
map
forEach
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
可以使用Arrays.stream()将数组转换为流:
Arrays.stream()
int[] ns = new int[] {1,2,3,4,5}; Arrays.stream(ns);
一旦你得到了你的流,你就可以使用的文档中描述的任何方法,比如sum()或其他。你可以像在Python中一样通过Lambda函数调用相关的流方法map或filter:
sum()
filter
Arrays.stream(ns).map(n -> n * 2); Arrays.stream(ns).filter(n -> n % 4 == 0);
一旦你完成了对流的修改,你就可以调用toArray()将它转换回一个数组以在其他地方使用:
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。 在这种情况下你需要这样做。
2 * Integer.MIN_VALUE
long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
请注意,Arrays.stream(arr)创建了一个LongStream(或IntStream,…)而不是Stream,因此map函数不能用于修改类型。这就是为什么.mapToLong, mapToObject,…提供了函数。
看看why-cant-i-map-integers-to-strings-when-streaming-from-an-array