ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Сумма и умножение массивов в Java 8: Stream API, Python-style

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Java
Скопировать код
int[] array = {1, 2, 3, 4, 5};
int sum = Arrays.stream(array).sum();

В Java 8 агрегированные операции над массивами, например, вычисление суммы, осуществляются с минимальным объемом кода и отсутствием циклов.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Основные операции со стримами для массивов

Java 8 предоставляет стримы, которые позволяют эффективно и удобно работать с массивами при помощи лямбда-выражений.

Умножение элементов массива

Для умножения элементов массива на определенное число можно применить функцию map таким образом:

Java
Скопировать код
int[] multiplied = Arrays.stream(array).map(i -> i * 2).toArray();

Поэлементное умножение массивов по индексам

Для поэлементного умножения двух массивов можно использовать следующий подход:

Java
Скопировать код
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 используется для преобразования элементов стрима:

Java
Скопировать код
Arrays.stream(array).forEach(System.out::println);

int[] mappedArray = Arrays.stream(array).map(i -> i * 2).toArray();

map является более подходящим для работы с большими объемами данных.

Работа с большими числами в массиве

Для избежания переполнения при работе с большими числами, рекомендуется использовать mapToLong():

Java
Скопировать код
long largeSum = Arrays.stream(array).mapToLong(i -> (long) i).sum();

Возврат к формату массива

Вы можете преобразовать стрим, после чего вернуть его обратно в формат массива при помощи toArray():

Java
Скопировать код
int[] squares = Arrays.stream(array).map(i -> i * i).toArray();

Продвинутые советы: выбор подходящего типа стрима

Выбор правильного типа стрима (IntStream, LongStream или Stream<T>) играет значительную роль для безопасной и эффективной работы программы.

Трансформация объектов: упаковка стримов

Для работы с объектами следует преобразовывать стримы:

Java
Скопировать код
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());

Эффективность стримов: IntStream.range

Для улучшения читаемости и производительности кода можно использовать IntStream.range:

Java
Скопировать код
int[] squared = IntStream.range(0, array.length)
                         .map(i -> array[i] * array[i])
                         .toArray();

Преимущества использования стримов

Создание стримов позволяет повысить доступность кода и производительность программы, однако следует помнить о некоторых трейдоффах, например, о возрастающих затратах при выполнении небольших операций.

Визуализация

Можно дополнительно представить взаимодействие массивов и стримов как взаимодействие поездов и железнодорожных станций. Каждая операция — это станция, через которую проходит поезд (массив).

За границами простых операций со стримами

После освоения основных возможностей работы со стримами рекомендуется изучить дополнительные методы в java.util.Arrays, которые были добавлены в Java 8.

Проведение нескольких операций одной строкой

Объединение нескольких операций в одной строчке делает код более лаконичным:

Java
Скопировать код
int[] evenSquares = IntStream.range(0, array.length)
                             .map(i -> array[i] * array[i])
                             .filter(i -> i % 2 == 0)
                             .toArray();

Манипуляция с массивами: использование стримов

При обработке массивов стримы демонстрируют свою мощь и гибкость, делая код более понятным и эстетически приятным.

Полезные материалы