36просмотров
19 января 2026 г.
statsScore: 40
🎭 Stream API: 3 неочевидных приёма, которые упростят ваш код Все знают filter() и map(), но Stream API гораздо богаче! ✈️ 1. Take/Drop While (Java 9+) — умная фильтрация: // Раньше: сложная логика с флагами
List<Integer> numbers = List.of(1, 2, 3, -1, 4, 5); // Взять элементы, пока условие истинно
numbers.stream() .takeWhile(n -> n > 0) // [1, 2, 3] .forEach(System.out::println); // Пропустить элементы, пока условие истинно
numbers.stream() .dropWhile(n -> n > 0) // [-1, 4, 5] .forEach(System.out::println);
✈️ 2. Теггирование (разделение на категории): Map<Boolean, List<User>> partitioned = users.stream() .collect(Collectors.partitioningBy(User::isActive));
// {true=[активные], false=[неактивные]} Map<Department, List<User>> grouped = users.stream() .collect(Collectors.groupingBy(User::getDepartment));
✈️ 3. Сворачивание (folding) с reduce: // Не только сумма! Любая агрегация
String concatenated = strings.stream() .reduce("", (s1, s2) -> s1 + ", " + s2); // Более эффективно с collect
String concatenated = strings.stream() .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) .toString(); // Максимальное значение с дефолтом
Optional<Integer> max = numbers.stream() .reduce(Integer::max);
💎 Бонус: Custom Collector для сложной логики: Collector<User, ?, Map<String, Double>> avgSalaryByDept = Collectors.groupingBy( User::getDepartment, Collectors.averagingDouble(User::getSalary) );
📌 Итог: Изучите полный java.util.stream.Collectors — там десятки полезных коллекторов для статистики, группировок и трансформаций. ✈️Подписаться: @iamjavadev #stream #java9 #функциональное #лайфхаки