Arrays.setAll不能使用布尔值

时间:2017-09-13 13:23:03

标签: java arrays lambda java-8 boolean

我想创建一个大数组,并想尝试一些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) - > {})

2 个答案:

答案 0 :(得分:8)

因为它应该是引用类型: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);

答案 1 :(得分:1)

将所有值设置为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没有setAll的{​​{1}}的现有实施,并且它最终消耗setAll(T[] array,IntFunction<? extends T> generator),这需要引用类型。另请注意,您可以按@Andremoniy的建议使用boolean[]创建自定义setAll方法。