java 8将两个int数组的所有值相加

Daf*_*ech 16 java java-8 java-stream

int[] ar1 = {1,2,3};
int[] ar2 = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

输出:

{2,3,4,3,4,5,4,5,6}
Run Code Online (Sandbox Code Playgroud)

我试过这样的事情:

IntStream.range(0,ar1.length).map(x -> IntStream.range(0,ar2.length).map(y -> ar1[y]+ar2[x]));
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

类型不匹配:无法转换IntStreamint.

如何使用流将Java 8中的每个值ar1与每个值相加ar2

Era*_*ran 14

您应该使用flatMap,因为mapIntStream预计每个地图int的原始元素IntStream一个int,而不是一个IntStream.

System.out.println(Arrays.toString (
    IntStream.range(0,ar1.length)
             .flatMap(x -> IntStream.range(0,ar2.length).map(y -> ar1[x]+ar2[y]))
             .toArray ()));
Run Code Online (Sandbox Code Playgroud)

输出:

[2, 3, 4, 3, 4, 5, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

作为创建IntStream数组索引的替代方法,您可以创建IntStream数组的元素:

System.out.println(Arrays.toString (
    Arrays.stream(ar1)
          .flatMap(x -> Arrays.stream(ar2).map(y -> x + y))
          .toArray ()));
Run Code Online (Sandbox Code Playgroud)

  • @corsiKa如果您有大量数据,则可以通过运行时将流拆分为多个核/线程,从而缩短执行时间.使用小数据集时,与双嵌套循环相比,它们会导致开销,因为它们的设置时间较长,但在大型集合中,这些数据集很有用. (6认同)
  • 为什么这样的流更像是一个双嵌套for循环?我知道它们是强大的工具,但我看不出它们的用处.我相信很多有经验的人使用它们但我没有亲自把握它. (3认同)

And*_*lko 8

对于每个i元素,您可以创建此元素IntStream的总和i + j以及j另一个数组的th元素:

IntStream.of(ar1).flatMap(i -> IntStream.of(ar2).map(j -> i + j)).toArray();
Run Code Online (Sandbox Code Playgroud)

我不建议使用索引流(IntStream.range(0,ar1.length)),它们可以用值本身(IntStream.of(ar1))流替换.


hol*_*ava 6

除了IntStream#flatMap之外,您还可以使用Arrays#stream(int [])来创建IntStream.例如:

int[] sum = Arrays.stream(ar1)
                  .flatMap(left -> Arrays.stream(ar2).map(right -> left + right))
                  .toArray();

System.out.println(Arrays.toString(sum));
//                        ^--- [2, 3, 4, 3, 4, 5, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)