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

我有一个我想用IntStream打印的2D数组。

这是arrays,

 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])上给出错误map(i -> twoD[i])

 Type mismatch: cannot convert from int[] to int 

但如果它是1Darrays那么它会起作用,例如,

 int[] oneD = { 1, 2, 3, 4, 5, 6 }; IntStream.range(0, oneD.length) .map(i -> oneD[i]) .forEach(System.out::print); 

如何使用上述方法打印2Darrays?

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

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

它的作用是:

  • int[][]数组中获取Stream
  • flatMap每个int[] IntStream到一个IntStream以便返回一个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的第一种方法是最好的。

既然你的解决方案无法编译?

这是因为IntStream上的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); 

……但我还是喜欢第一种方法! 🙂

为什么不流式传输数组:

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