Eu tenho uma matriz 2D de inteiros (0 ou 1), como assim ...
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}
};
e eu quero convertê-lo em uma matriz 2D de booleanos usando Java córregos e .map (). A matriz resultante ser:
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}
};
Minha última tentativa foi:
boolean[][] gridBool = Arrays.stream(gridInt)
.map(row -> Arrays.stream(row)
.mapToObj(i -> i == 1)
.toArray(Boolean[]::new)
)
.toArray(Boolean[][]::new);
Mas o meu código não está compilando, a mensagem de erro é:
error: incompatible types: inferred type does not conform to upper bound(s)
.toArray(Boolean[][]::new);
^
inferred: Boolean[]
upper bound(s): boolean[],Object
Você poderia me dizer o que estou fazendo de errado e como corrigi-lo? Obrigado.
Se você precisar de um Boolean[][]
, como resultado, então é tão simples como mudar o tipo de receptor a partir boolean
de Boolean
:
Boolean[][] gridBool = Arrays.stream(gridInt)
.map(row -> Arrays.stream(row)
.mapToObj(i -> i == 1)
.toArray(Boolean[]::new)
)
.toArray(Boolean[][]::new);
No entanto, parece que você quer um boolean[][]
como resultado; Infelizmente, uma vez que não é BooleanStream
, não seria sábio para executar esta através de um fluxo como a legibilidade ou concisão não é a melhor, em vez de uma abordagem imperativo seria melhor:
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;
}