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

是否可以构造一个Java流表达式来返回一个2D布尔数组,所有值都设置为true?,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我正在学习流表达式,并尝试使用它们构造一个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 =

我正在学习流表达式,并尝试使用它们构造一个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[][] bool_array = IntStream.range(0,h).mapToObj(i->IntStream.range(0,w).
          mapToObj(j->true).toArray()).toArray(boolean[][]::new);

抛出一个
ArrayStoreException

使用循环更方便。Lambda语句和流并不能从根本上取代循环,在这种上下文中使用循环的简单性要简单得多,也更容易处理


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

如果您想使用流,您可以这样做:

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[][]
数组的方法(即对象类型Boolean,而不是基元类型)。该行与我问题中的行几乎相同,但在第一个toArray()中转换为
Boolean[]


…这比循环更可取,因为。。。?这里没有并发或线程。我从来没有说过或暗示过它更可取。我只是简单地回答OP的问题,没有对它进行评判。我已经玩了很多次
java.util.stream.stream
,尝试了很多不同版本的代码。学习Java的一半工作变成了准确地计算出你应该对一个流做什么。我最终决定使用
Stream.Builder
IntStream.Builder
来(快速)创建事物列表。。查看是否可以使用
(以及它是否使代码更丑或更好)总是很好的有人可以合理地说,不清楚你在问什么——你的标题或你的代码有什么问题——因为人们不断地问这样的重新调试问题,而问如何编写他们的总体目标,所以读者会这样做并不奇怪。如果问题是标题&你还没有调试过,那么你还没有完成足够的研究——向下投票,但不是接近投票——如果你问的是重新调试,那就不清楚了&你没有给出一个——两个投票。当你得到你不理解的结果时,把事情搁置起来,找出你不理解的东西。很高兴你找到了解决办法。我对你是否接近没有意见。我只是想说我想说的很清楚。PS您没有编辑以减轻我提到的那种不清楚的合理解释。(正如我所说的,)海报上似乎不理解的代码看起来太像是调试请求&不能作为尝试的示例,因为它首先需要调试。PS一个解决方案(无论问题是什么)真的应该放在答题帖上,而不是问题。@philipxy我知道你认为这不清楚,你认为需要调试。我没有。我不认为这篇文章要求任何调试。我很清楚,他们想要一个二维的
boolean
数组。他们尝试了一个二维
int
数组,该数组对
boolean
有效,但对
boolean
无效,现在想知道它是否可行。
Stream.toArray()
返回一个
对象[]
,该对象无法转换为
boolean[]
,因此无法使用。您也不能在“内部”结果上使用
Stream.toArray(boolean[]::new)
,因为
boolean
是一个基元,不能用作泛型参数类型的变量。它适用于
int
,因为
IntStream
有一个内置的方法来创建
int[]
。正如您所发现的,它适用于
Boolean[][]
,因为
Boolean
可以用作泛型参数的变量,但这仍然不能让您获得
Boolean[][]
@Gimby,我认为OP有足够的时间对您的评论采取行动,但选择了不这样做。因此,在添加答案之前,我将问题回滚到修订版。
Boolean[][] bool_array = IntStream.range(0,h).mapToObj(i->IntStream.range(0,w).
           mapToObj(j->true).toArray(Boolean[]::new)).toArray(Boolean[][]::new);