加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:25:33 所属栏目:Java 来源:网络整理
导读:我有一个我想用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打印的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]

所以我试过这个,twoD.length) .map(i -> twoD[i]) .flatMap(j -> IntStream.range(0,twoD[j].length)) .forEach(System.out::print);

但它在地图上给出错误(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);

它的作用是:

>获取Stream< int []>来自int [] []数组
>将每个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的第一种方法是最好的.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读