Несоответствие типов: невозможно преобразовать IntStream в int - PullRequest
0 голосов
/ 06 апреля 2019

Я столкнулся с проблемой при компиляции этого кода, как показано ниже:

int[][] result = Arrays.stream(board)
            .map(r -> IntStream.range(0, board[0].length)
                    .map(i -> IntStream.range(0, board.length).map(j -> decideAliveOrDied(i, j, board)))
                    .toArray())
            .toArray(int[][]::new);

Плата является входной матрицей, в которой мы можем выполнить некоторое преобразование. Метод defineAliveOrDied (int i, int j, int [] [] board) преобразует ячейку каждой входной матрицы в другую ячейку для заданного индекса строки i, индекса столбца j и платы матрицы. Матрица result является выходом всей модификации на матрице board .

Для получения дополнительной информации, это мой метод defineAliveOrDied :

public int decideAliveOrDied(int i, int j, int[][] board) {
        int result = 0;
        ArrayList<Integer> list = getNeighbors(i, j, board[0].length, board.length, board);
        int numberOfLiveCell = (int) list.stream().filter(number -> number == 1).count();
        if (board[i][j] == 1 && numberOfLiveCell < 2) {
            result = 0;
        }
        if (board[i][j] == 1 && (numberOfLiveCell == 2 || numberOfLiveCell == 3)) {
            result = 1;
        }
        if (board[i][j] == 1 && numberOfLiveCell > 3) {
            result = 0;
        }
        if (board[i][j] == 0 && numberOfLiveCell == 3) {
            result = 1;
        }

        return result;
    }

Но я получаю ошибку компиляции, как описано ниже:

- Type mismatch: cannot convert from IntStream to int
- The method map(IntUnaryOperator) in the type IntStream is not applicable for the arguments ((<no 
     type> j) -> {})

Заранее спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019

Трудно догадаться, чего вы пытаетесь достичь.Насколько я понял, ваш код может быть уменьшен до:

int[][] finalBoard = new int[board.length][board[0].length];

for (int i = 0; i < board.length; i++) {
    for (int j = 0; j < board[i].length; j++) {
        int result = decideAliveOrDied(i, j, board);    
        finalBoard[i][j] = result;
    }
}

Вы не обязательно должны всегда использовать потоки.Особенно, если у вас три вложенных map с.

1 голос
/ 06 апреля 2019

На самом деле не уверен, что Stream API здесь хорошее решение.Но вы отображаете IntStream в другой поток.Для этого используйте flatMap:

....
.map(r -> IntStream.range(0, board[0].length)
        .flatMap(i -> IntStream.range(0, board.length).map(j -> decideAliveOrDied(i, j, board)))
        .toArray())
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...