[英]printing 2D array using IntStream's flatMap method
我有一个我想用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])
上给出错误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阵列?
我认为你过于复杂。 你可以这样做:
Stream.of(twoD).flatMapToInt(IntStream::of).forEach(System.out::println);
它的作用是:
int[][]
数组中获取Stream<int[]>
flatMap
每个int[]
IntStream
到一个IntStream
以便返回一个IntStream
2D数组所有元素的IntStream
IntStream.range(0, twoD.length)
.mapToObj(i -> twoD[i])
.flatMapToInt(IntStream::of)
.forEach(System.out::print);
产生相同的输出,但你可以看到它不是很可读。 在这里,您不需要流式索引,因此使用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);
......但我还是喜欢第一种方法! :)
为什么不流式传输数组:
Arrays.stream(twoD)
.flatMapToInt(Arrays::stream)
.forEach(System.out::println);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.