Arrays.setAll 不适用于布尔值

Posted

技术标签:

【中文标题】Arrays.setAll 不适用于布尔值【英文标题】:Arrays.setAll wont work with boolean 【发布时间】:2018-02-22 05:43:57 【问题描述】:

我想创建一个大数组,并想尝试一些 lambda,但出于某种原因:

cells = new boolean[this.collums][this.rows];
IntStream.range(0, cells.length).forEach(x -> Arrays.setAll(cells[x], e -> MathX.fastNextInt(1) == 0 ? true : false));

不会工作,即使这样:

cells = new boolean[this.collums][this.rows];
IntStream.range(0, cells.length).forEach(x -> Arrays.setAll(cells[x], e -> true));

不工作。

编译错误是:

类型不匹配:无法从布尔值转换为 T

和:

Arrays类型中的方法setAll(T[], IntFunction)不适用于参数(boolean[], (e) -> )

【问题讨论】:

MathX.fastNextInt(1) == 0 ? true : false 可以简化为 MathX.fastNextInt(1) == 0 @SeanBright MathX 到底是什么? @nullpointer,没有线索。 MathX 只是我的数学函数,比如 Math expandet。 @TheSorm 如果你特别需要坚持boolean[][] 的实现,你也可以使用Arrays.fill。 【参考方案1】:

因为应该是引用类型:Boolean:

Boolean[][] cells = new Boolean[this.collums][this.rows];

UPD:如果您想使用boolean 类型,您必须为原始布尔类型编写自己的setAll() 实现:

interface BooleanUnaryOperator 
    boolean apply(int x);


public static void setAll(boolean[] array, BooleanUnaryOperator generator) 
    for (int i = 0; i < array.length; i++)
        array[i] = generator.apply(i);

UPD-2:正如@Holger 提到的,BooleanUnaryOperator 的名称具有误导性,最好使用现有的类 - IntPredicate。 (在这种情况下将array[i] = generator.apply(i); 更改为array[i] = generator.test(i);

【讨论】:

还有没有办法用布尔类型?我不能使用布尔值,因为数组非常大,我需要快速处理并快速创建它。 @TheSorm 数组非常大,我需要快速处理它并快速创建它,原始与参考之间的阻碍如何? @nullpointer 我试过了,使用布尔值是通过将 10000 +10000 数组慢 2 到 10 倍。 @TheSorm 当然会因为自动装箱布尔值而变慢。只是作为一个提示,尝试用Boolean.TRUE 替换e -&gt; true(和false 分别用Boolean.FALSE) - 在处理Boolean[][] 类型时 BooleanUnaryOperator 是一个具有误导性的名称,因为它暗示了 (boolean) -&gt; boolean 签名。 java.util.function 方案后面的正确名称是 IntToBooleanFunctionIntPredicate。后者甚至does exist…【参考方案2】:

将所有值设置为 true 的另一种方法是使用 Arrays.fill 并在一维上进行迭代:

cells = new boolean[this.collums][this.rows];
for (boolean[] cell : cells) 
    Arrays.fill(cell, true);


如果setAll 是唯一的选择,您必须在代码中使用引用类型Boolean

Boolean [][] cells = new Boolean[10][10];
IntStream.range(0, cells.length).forEach(x -> Arrays.setAll(cells[x], e -> true));

由于Arrays 没有针对boolean[]setAll 的现有实现,因此它最终消耗了需要引用类型的setAll(T[] array,IntFunction&lt;? extends T&gt; generator)。另请注意,您可以按照@Andremoniy 的建议使用boolean 创建自定义setAll 方法。

【讨论】:

以上是关于Arrays.setAll 不适用于布尔值的主要内容,如果未能解决你的问题,请参考以下文章

布尔值不适用于 If 语句(Javascript)

JSON_EXTRACT 不适用于 BigQuery 中的布尔值

复选框不适用于布尔视图模型属性

大摇大摆的布尔值作为字符串而不是 NestJS 中的布尔值发送

如何在Google表格中为Google Data Studio数据源存储布尔值?

为啥析取赋值运算符 |= 不适用于布尔向量?