Потоки могут делать это тоже:
//Create 2D array
int[][] array = {{1,2,3},{4,5},{6}};
//Sum all elements of array
int sum = Stream.of(array).flatMapToInt(IntStream::of).sum();
System.out.println(sum);
Выделение кода суммирования:
Stream.of(array)
Превращает двумерный массив типа int[][]
в Stream<int[]>
, Отсюда нам нужно go на один уровень глубже, чтобы обработать каждый дочерний массив в 2D-массиве, поскольку поток передает только первое измерение.
Таким образом, на этом этапе у нас будет поток, содержащий:
- массив int [], содержащий {1,2,3}
- массив int [], содержащий {4,5}
- массив int [], содержащий {6}
.flatMapToInt(IntStream::of)
Пока у нас есть Поток int[]
, все еще двумерный. Плоская карта объединяет структуру в единый поток целых чисел.
flatMapToInt()
расширяет каждый int[]
элемент потока в одно или несколько значений int
. IntStream.of()
принимает массив int[]
и превращает его в поток int. Объединение этих двух значений дает один поток int
значений.
После сглаживания у нас будет поток int:
{1,2,3,4,5,6 }
.sum()
Теперь у нас есть IntStream
со всеми элементами, развернутыми из исходного двумерного массива, просто получается сумма всех значений.
Теперь отказ от ответственности - если вы новичок в Java и изучаете массивы, это может быть слишком сложным. Я бы рекомендовал узнать о вложенности циклов for и перебирать массивы. Но также полезно знать, когда API может сделать большую часть работы за вас.