如何在Java中使用streams将二维整数数组转换为二维布尔数组?

如何在Java中使用streams将二维整数数组转换为二维布尔数组?,java,dictionary,multidimensional-array,type-conversion,java-stream,Java,Dictionary,Multidimensional Array,Type Conversion,Java Stream,我有一个整数0或1的2D数组,就像这样 int [][] gridInt = { {0, 0, 0, 1, 0, 0}, {0, 0, 1, 1, 0, 0}, {1, 0, 1, 0, 0, 1}, {0, 0, 0, 0, 1, 0}, {0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} }; 我想使用Java streams和.map将其转换为一个二维布尔数组

我有一个整数0或1的2D数组,就像这样

int [][] gridInt = {
        {0, 0, 0, 1, 0, 0},
        {0, 0, 1, 1, 0, 0},
        {1, 0, 1, 0, 0, 1},
        {0, 0, 0, 0, 1, 0},
        {0, 1, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0}
    };
我想使用Java streams和.map将其转换为一个二维布尔数组。生成的数组为:

boolean[][] gridBool = {
        {false, false, false, true, false, false},
        {false, false, true, true, false, false},
        {true, false, true, false, false, true},
        {false, false, false, false, true, false},
        {false, true, false, false, false, false},
        {false, false, false, false, false, false}
    };
我最近的尝试是:

boolean[][] gridBool = Arrays.stream(gridInt)
    .map(row -> Arrays.stream(row)
        .mapToObj(i -> i == 1)
        .toArray(Boolean[]::new)
    )
    .toArray(Boolean[][]::new);
但是我的代码没有编译,错误消息是:

error: incompatible types: inferred type does not conform to upper bound(s)
        .toArray(Boolean[][]::new);
                ^
inferred: Boolean[]
upper bound(s): boolean[],Object

你能告诉我我做错了什么以及如何修复它吗?谢谢。

您可以将结果数组更改为布尔值:

mapToObj需要一个对象,而不是基本类型boolean,因此我们不能使用toArrayboolean[]]::new

如果您需要一个布尔值[],那么只需将接收器类型从布尔值更改为布尔值即可:

但是,您似乎想要一个布尔值[][];不幸的是,由于没有BooleanStream,因此通过流执行此操作是不明智的,因为可读性或简洁性不是最好的,而命令式方法会更好:

boolean[][] result = new boolean[gridInt.length][];
for (int i = 0; i < gridInt.length; i++) {
     boolean[] temp = new boolean[gridInt[i].length];
     for (int j = 0; j < gridInt[i].length; j++) 
          temp[j] = gridInt[i][j] == 1;         
     result[i] = temp;
}

您可以将逻辑简化为:

boolean[][] gridBool = new boolean[gridInt.length][gridInt[0].length]; // NxN grid
for (int i = 0; i < gridInt.length; i++) {
    for (int j = 0; j < gridInt[0].length; j++) {
        gridBool[i][j] = gridInt[i][j] != 0;
    }
}

注意:这避免了为每次迭代创建临时数组,因此将进一步节省空间,并预先使用精确边界初始化数组。

布尔值不是布尔值!这很简单-只需将一个小写b更改为大写b。布尔[][]gridBool…谢谢。我确实想到了迭代方法,但我认为我可以以某种方式使用map方法使其更容易/更短。所以我猜除了int、long和double之外,streams不能很好地处理原始类型?或者至少还回去?@EJC是的,关于为什么没有CharStream或BooleanStream,有很多问题。当您想将某种类型的特定序列转换为char或BooleanStream序列时,它不是最可读/简洁的,也不会比使用命令式循环更好,因为没有CharStream或BooleanStream,但是,正如您所提到的,其他基元类型对每个基元类型都有专门的流,因此它们会很方便。@EJC如果要使用流来实现此目的,您需要声明一个布尔[][]result=new boolean[gridInt.length][];然后使用IntStream.range+forEach完成工作,这基本上就是上面的命令式方法所做的,但以更惯用的方式。
boolean[][] result = new boolean[gridInt.length][];
for (int i = 0; i < gridInt.length; i++) {
     boolean[] temp = new boolean[gridInt[i].length];
     for (int j = 0; j < gridInt[i].length; j++) 
          temp[j] = gridInt[i][j] == 1;         
     result[i] = temp;
}
boolean[][] gridBool = new boolean[gridInt.length][gridInt[0].length]; // NxN grid
for (int i = 0; i < gridInt.length; i++) {
    for (int j = 0; j < gridInt[0].length; j++) {
        gridBool[i][j] = gridInt[i][j] != 0;
    }
}