Collectors в Java
Collectors.summingInt
Collectors.summingInt — это специализированный коллектор, предназначенный для суммирования целочисленных значений, извлекаемых из элементов потока. Он особенно полезен, когда нужно вычислить общую сумму числовых характеристик объектов.
1. Базовая форма и назначение
Сигнатура:
Где:
mapper — функция, преобразующая элемент потока в int (значение, которое нужно суммировать)
Возвращает коллектор, который применяет эту функцию ко всем элементам и суммирует результаты
Пример:
2. Внутренняя реализация
Коллектор работает по следующему алгоритму:
Использует промежуточный аккумулятор типа int[] (для мутабельного накопления суммы)
Для каждого элемента применяет mapper и добавляет результат в аккумулятор
В конце возвращает итоговую сумму
3. Особенности и ограничения
3.1. Только для примитивных int
Для long используйте summingLong
Для double — summingDouble
3.2. Нет обработки null
Если mapper возвращает null, будет NullPointerException
3.3. Параллельные стримы
Корректно работает в параллельных стримах благодаря атомарному накоплению
4. Альтернативы
4.1. Через mapToInt() + sum()
Более прямолинейный способ:
Плюсы:
Чуть лучше производительность
Более явное преобразование типов
Минусы:
Нельзя использовать в комбинации с другими коллекторами (например, при группировке)
4.2. reduce()
5. Комбинирование с другими коллекторами
Особенно полезно в groupingBy для агрегации:
Пример вывода:
6. Производительность
Для примитивов (summingInt) работает быстрее, чем reduce с Integer
В HotSpot JIT-компилятор может оптимизировать до прямого сложения
#Java #Training #Medium #Collectors #summingInt
Collectors.summingInt
Collectors.summingInt — это специализированный коллектор, предназначенный для суммирования целочисленных значений, извлекаемых из элементов потока. Он особенно полезен, когда нужно вычислить общую сумму числовых характеристик объектов.
1. Базовая форма и назначение
Сигнатура:
public static <T> Collector<T, ?, Integer> summingInt(ToIntFunction<? super T> mapper)
Где:
mapper — функция, преобразующая элемент потока в int (значение, которое нужно суммировать)
Возвращает коллектор, который применяет эту функцию ко всем элементам и суммирует результаты
Пример:
List<Product> products = List.of(
new Product("Laptop", 1000),
new Product("Phone", 500),
new Product("Tablet", 300)
);
int totalPrice = products.stream()
.collect(Collectors.summingInt(Product::getPrice));
// Результат: 1800 (1000 + 500 + 300)
2. Внутренняя реализация
Коллектор работает по следующему алгоритму:
Использует промежуточный аккумулятор типа int[] (для мутабельного накопления суммы)
Для каждого элемента применяет mapper и добавляет результат в аккумулятор
В конце возвращает итоговую сумму
3. Особенности и ограничения
3.1. Только для примитивных int
Для long используйте summingLong
Для double — summingDouble
3.2. Нет обработки null
Если mapper возвращает null, будет NullPointerException
3.3. Параллельные стримы
Корректно работает в параллельных стримах благодаря атомарному накоплению
4. Альтернативы
4.1. Через mapToInt() + sum()
Более прямолинейный способ:
int total = products.stream()
.mapToInt(Product::getPrice)
.sum();
Плюсы:
Чуть лучше производительность
Более явное преобразование типов
Минусы:
Нельзя использовать в комбинации с другими коллекторами (например, при группировке)
4.2. reduce()
int total = products.stream()
.reduce(0, (sum, p) -> sum + p.getPrice(), Integer::sum);
5. Комбинирование с другими коллекторами
Особенно полезно в groupingBy для агрегации:
Map<String, Integer> totalPriceByCategory = products.stream()
.collect(Collectors.groupingBy(
Product::getCategory,
Collectors.summingInt(Product::getPrice)
));
Пример вывода:
{
"Electronics": 1800,
"Office": 750
}
6. Производительность
Для примитивов (summingInt) работает быстрее, чем reduce с Integer
В HotSpot JIT-компилятор может оптимизировать до прямого сложения
#Java #Training #Medium #Collectors #summingInt