使用IntStream的flatMap方法打印2D数组

时间:2015-02-14 16:31:06

标签: java java-8

我想要使用IntStream打印一个2D数组。

这是数组,

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是索引值而不是数组中的值,我必须使用类似i -> twoD[i]之类的值将这些值映射到数组值

所以我试过了,

    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

但是如果它是1D数组那么它就会起作用,例如,

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

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

如何使用上述方法打印2D阵列?

2 个答案:

答案 0 :(得分:4)

我认为你过于复杂。你可以这样做:

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

它的作用是:

  • Stream<int[]>数组
  • 获取int[][]
  • flatMap每个int[]IntStream,以便您获得包含2D数组所有元素的IntStream
  • 为每个元素打印

<小时/> 你想要做的是可实现但不可读。嵌套循环的正式翻译将是:

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

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

为什么你的解决方案无法编译?

这是因为map上的IntStream期望一个映射函数可以返回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);

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

答案 1 :(得分:3)

为什么不流式传输数组:

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