繁体   English   中英

是否可以构造一个 Java 流表达式来返回一个 2D 布尔数组,所有值都设置为 true?

[英]Is it possible to construct a Java stream expression to return a 2D boolean array, all values set to true?

我正在学习流表达式并尝试使用它们来构造一个 2D 布尔数组,所有值都设置为 true。 就像是:

boolean[][] bool_array = [stream expression returning a
                             2D array boolean[h][w], all values set to true]

这是可能的,表达式是什么?

我知道int[][]数组可以使用流创建,例如

int h=5;
int w=8;
int[][] int_array = IntStream.range(0,h).mapToObj(i->IntStream.range(0,w).
          map(j->1).toArray()).toArray(int[][]::new);

返回一个填充了 1 的int[5][8] 但是试图boolean[][]boolean[][]起作用

boolean[][] bool_array = IntStream.range(0,h).mapToObj(i->IntStream.range(0,w).
          mapToObj(j->true).toArray()).toArray(boolean[][]::new);

抛出一个ArrayStoreException

如果你想用流来做,你可以这样做:

int rows = 5;
int cols = 5;

boolean[][] bool2D = IntStream.range(0, rows)
        .mapToObj(r -> {
            boolean[] rr;
            Arrays.fill(rr = new boolean[cols], true);
            return rr;
        }).toArray(boolean[][]::new);


for (boolean[] b : bool2D) {
    System.out.println(Arrays.toString(b));
}

印刷

[true, true, true, true, true]
[true, true, true, true, true]
[true, true, true, true, true]
[true, true, true, true, true]
[true, true, true, true, true]

我发现了一种制作Boolean[][]数组的方法(即对象类型布尔值,而不是原始类型)。 该行与我的问题中的行几乎相同,但在第一个 toArray() 中强制转换为Boolean[]

Boolean[][] bool_array = IntStream.range(0,h).mapToObj(i->IntStream.range(0,w).
           mapToObj(j->true).toArray(Boolean[]::new)).toArray(Boolean[][]::new);

使用循环更方便。 Lambda 语句和流并没有从根本上取代循环,在这种情况下使用循环所获得的简单性要简单得多,也更容易处理。

请注意,我的回答也是基于对 lambda 表达式的学习。 当他们第一次出现时,我也认为他们可以做很多循环可以做的事情。 但是,学习新工具或方法还包括学习何时使用它,并且一般迭代绝对不是 lambda 适合用途的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM