2014-11-16 2 views
0

я однажды написал замену функций вроде этого:Запись вложенных циклов с потоками

int[][] createMatrix(int height, int width) { 
    int[][] matrix = new int[height][width]; 
    for (int i = 0; i < height; ++i) { 
     for (int j = 0; j < width; ++j) { 
     matrix[i][j] = i * width + j; 
     } 
    } 
    return matrix; 
} 

Но теперь, я обнаружил, что не в состоянии сделать это снова. Как этот код может быть реорганизован для использования потоков в Java 8?

+1

Вы можете использовать вложенные 'IntStream'. – assylias

ответ

6

С IntStream с:

IntStream.range(0, height) 
    .forEach(i -> IntStream.range(0, width) 
      .forEach(j -> matrix[i][j] = i * width + j)); 

Вы также можете использовать Arrays#setAll:

Arrays.setAll(matrix, i -> { 
    Arrays.setAll(matrix[i], j -> i * width + j); 
    return matrix[i]; 
}); 

Или объединить их:

IntStream.range(0, height) 
    .forEach(i -> Arrays.setAll(matrix[i], j -> i * width + j)); 
+0

См. Также http://stackoverflow.com/a/26056254/2711488 – Holger

2

более функциональное решение (без мутирует внешней переменной) :

int[][] matrix = 
    IntStream.range(0, height) 
      .mapToObj(i -> IntStream.range(0, width) 
            .map(j -> i*width + j) 
            .toArray()) 
      .toArray(int[][]::new); 
Смежные вопросы