gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:25:10 25 4
gpt4 key购买 nike

我有一个二维数组,我想使用 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 是索引值而不是数组中的值,我必须使用类似的方法将这些值映射到数组值, 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

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

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

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

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

最佳答案

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

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

它的作用是:

  • 得到一个Stream<int[]>来自 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是最好的。

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

是因为mapIntStream 上期待一个映射函数给你返回 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);

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

关于java - 使用 IntStream 的 flatMap 方法打印二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28517664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com