[英]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.