Java 8流和数组上的操作

Java 8流和数组上的操作,java,arrays,java-8,java-stream,Java,Arrays,Java 8,Java Stream,我刚刚发现了新的Java8流功能。来自Python,我想知道现在是否有一种简洁的方法来对数组进行操作,比如求和,以“一行pythonic”的方式将两个数组相乘 感谢在java.util.Arrays中添加了一些新方法,可以将数组转换为Java8流,然后用于求和等 int sum = Arrays.stream(myIntArray).sum(); 将两个数组相乘有点困难,因为我想不出一种方法可以在流操作的同时获得值和索引。这意味着您可能必须对数组的索引进行流式处理 //in this exa

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


感谢在
java.util.Arrays
中添加了一些新方法,可以将数组转换为Java8流,然后用于求和等

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]);

评论员指出,您可以使用
map
方法,而不是像这样使用
forEach

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

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

获得流后,可以使用中描述的任何方法,如
sum()
或其他方法。通过使用Lambda函数调用相关的流方法,可以像Python中那样
map
filter

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();

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

int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0
上述总和不是
2*整数.MIN\u值
。 在这种情况下你需要这样做

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

请注意,Arrays.stream(arr)创建一个LongStream(或IntStream,…)而不是stream,因此map函数不能用于修改类型。这就是为什么。mapToLong,mapToObject。。。提供了一些功能


看看
int[]result=IntStream.range(0,a.length).map(i->a[i]*b[i]).toArray()@Holger是的,那也行。虽然您可能希望使用
mapToInt
来避免装箱,但最后一步相当于模拟zip,您必须为结果预先分配存储。我想知道为什么Streams库中没有zip?据我所知,一个zip出现在Java8的早期测试版中,然后被删除了。幸运的是,海报上有来源,答案中也有。我已经多次使用该代码,它似乎工作得很好。@dkatzel-因为它已经是一个IntStream,“map”需要一个IntUnaryOperator,所以不需要装箱。
long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct