Сумма и умножение массивов в Java 8: Stream API, Python-style
Быстрый ответ
int[] array = {1, 2, 3, 4, 5};
int sum = Arrays.stream(array).sum();
В Java 8 агрегированные операции над массивами, например, вычисление суммы, осуществляются с минимальным объемом кода и отсутствием циклов.
Основные операции со стримами для массивов
Java 8 предоставляет стримы, которые позволяют эффективно и удобно работать с массивами при помощи лямбда-выражений.
Умножение элементов массива
Для умножения элементов массива на определенное число можно применить функцию map
таким образом:
int[] multiplied = Arrays.stream(array).map(i -> i * 2).toArray();
Поэлементное умножение массивов по индексам
Для поэлементного умножения двух массивов можно использовать следующий подход:
int[] array2 = {2, 4, 6, 8, 10};
int[] product = IntStream.range(0, array.length)
.map(i -> array[i] * array2[i])
.toArray();
Однако следует обращать внимание на длины массивов, чтобы избежать возникновения исключения IndexOutOfBoundsException
.
map против forEach: какой выбор предпочтительнее
Оператор forEach
лучше всего подходит для выполнения операций, имеющих побочные эффекты, например, вывода результатов в консоль. Вместе с тем, оператор map
используется для преобразования элементов стрима:
Arrays.stream(array).forEach(System.out::println);
int[] mappedArray = Arrays.stream(array).map(i -> i * 2).toArray();
map
является более подходящим для работы с большими объемами данных.
Работа с большими числами в массиве
Для избежания переполнения при работе с большими числами, рекомендуется использовать mapToLong()
:
long largeSum = Arrays.stream(array).mapToLong(i -> (long) i).sum();
Возврат к формату массива
Вы можете преобразовать стрим, после чего вернуть его обратно в формат массива при помощи toArray()
:
int[] squares = Arrays.stream(array).map(i -> i * i).toArray();
Продвинутые советы: выбор подходящего типа стрима
Выбор правильного типа стрима (IntStream
, LongStream
или Stream<T>
) играет значительную роль для безопасной и эффективной работы программы.
Трансформация объектов: упаковка стримов
Для работы с объектами следует преобразовывать стримы:
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());
Эффективность стримов: IntStream.range
Для улучшения читаемости и производительности кода можно использовать IntStream.range
:
int[] squared = IntStream.range(0, array.length)
.map(i -> array[i] * array[i])
.toArray();
Преимущества использования стримов
Создание стримов позволяет повысить доступность кода и производительность программы, однако следует помнить о некоторых трейдоффах, например, о возрастающих затратах при выполнении небольших операций.
Визуализация
Можно дополнительно представить взаимодействие массивов и стримов как взаимодействие поездов и железнодорожных станций. Каждая операция — это станция, через которую проходит поезд (массив).
За границами простых операций со стримами
После освоения основных возможностей работы со стримами рекомендуется изучить дополнительные методы в java.util.Arrays
, которые были добавлены в Java 8.
Проведение нескольких операций одной строкой
Объединение нескольких операций в одной строчке делает код более лаконичным:
int[] evenSquares = IntStream.range(0, array.length)
.map(i -> array[i] * array[i])
.filter(i -> i % 2 == 0)
.toArray();
Манипуляция с массивами: использование стримов
При обработке массивов стримы демонстрируют свою мощь и гибкость, делая код более понятным и эстетически приятным.