使用 IntStream 的 flatMap 方法打印二维数组

printing 2D array using IntStream's flatMap method

我有一个二维数组,我想使用 IntStream 打印它。

这是数组,

int[][] twoD = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

现在,使用嵌套循环可以这样完成,

    for (int i = 0; i < twoD.length; i++) {
        for (int j = 0; j < twoD[i].length; j++) {
            System.out.println(twoD[i][j]);
        }
    }

但我想使用 IntStream。我最近了解了它的 flatMap 方法,我可以用它来实现这一点,所以我尝试了这个,

    IntStream.range(0, twoD.length)
            .flatMap(j -> IntStream.range(0, twoD[j].length))
            .forEach(System.out::print);

并输出 010101

输出为 010101 的一个原因是 010101 是索引值而不是数组中的值,我必须使用类似 [=22 的方法将这些值映射到数组值=]

所以我试过了,

    IntStream.range(0, twoD.length)
            .map(i -> twoD[i])
            .flatMap(j -> IntStream.range(0, twoD[j].length))
            .forEach(System.out::print);

但它在 map(i -> twoD[i])

上给出错误
Type mismatch: cannot convert from int[] to int

但是如果它是一维数组那么它就可以工作,例如,

int[] oneD = { 1, 2, 3, 4, 5, 6 };

IntStream.range(0, oneD.length)
.map(i -> oneD[i])
.forEach(System.out::print);

如何使用上述方法打印二维数组?

为什么不流式传输数组本身:

Arrays.stream(twoD)
      .flatMapToInt(Arrays::stream)
      .forEach(System.out::println);

我认为你把事情复杂化了。你可以这样做:

Stream.of(twoD).flatMapToInt(IntStream::of).forEach(System.out::println);

它的作用是:

  • int[][] 数组中得到一个 Stream<int[]>
  • flatMap 每个 int[] 到一个 IntStream 这样你就可以得到一个 IntStream 和二维数组
  • 的所有元素
  • 对于每个元素,打印它


你想做的事情是可以实现的,但可读性不强。嵌套循环的正式翻译是:

IntStream.range(0, twoD.length)
         .forEach(i -> IntStream.range(0, twoD[i].length)
                                .forEach(j -> System.out.println(twoD[i][j])));

产生相同的输出,但如您所见,它的可读性不高。在这里您不需要流式传输索引,因此使用 flatMapToInt 的第一种方法是最好的。

现在,为什么您的解决方案无法编译?

这是因为 IntStream 上的 map 期望映射函数返回 int 但你给出 int[]。您需要使用 mapToObj 然后再次使用 flatMapToInt 以获得 IntStream 并最终打印内容(但这不是唯一的解决方案)。

IntStream.range(0, twoD.length)
         .mapToObj(i -> twoD[i])
         .flatMapToInt(IntStream::of)
         .forEach(System.out::print);

你的可读性提高了吗?不一定,所以我建议使用第一种方法,简洁明了。

注意最后一个解也可以写成:

IntStream.range(0, twoD.length)
         .flatMap(i -> IntStream.of(twoD[i]))
         .forEach(System.out::print);

...但我还是更喜欢第一种方法! :)