使用 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);
...但我还是更喜欢第一种方法! :)
我有一个二维数组,我想使用 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);
...但我还是更喜欢第一种方法! :)