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 -> true
(和false
分别用Boolean.FALSE
) - 在处理Boolean[][]
类型时
BooleanUnaryOperator
是一个具有误导性的名称,因为它暗示了 (boolean) -> boolean
签名。 java.util.function
方案后面的正确名称是 IntToBooleanFunction
或 IntPredicate
。后者甚至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<? extends T> generator)
。另请注意,您可以按照@Andremoniy 的建议使用boolean
创建自定义setAll
方法。
【讨论】:
以上是关于Arrays.setAll 不适用于布尔值的主要内容,如果未能解决你的问题,请参考以下文章
JSON_EXTRACT 不适用于 BigQuery 中的布尔值
大摇大摆的布尔值作为字符串而不是 NestJS 中的布尔值发送