Java 8 Streams: декларативная обработка данных
Stream — новый абстрактный слой в Java 8 для декларативной обработки данных (как SQL). Вместо циклов и ручных проверок — конвейер операций. Автоматически использует многоядерные процессоры через parallelStream().
Характеристики Stream
- Sequence of elements — элементы вычисляются по требованию (lazy), не хранятся.
- Source — Collections, Arrays, I/O ресурсы.
- Aggregate operations — filter, map, limit, reduce, find, match...
- Pipelining — большинство операций возвращают Stream (intermediate),
collect()— terminal. - Automatic iterations — итерация внутри, не нужно писать циклы.
Создание стримов
Collection.stream() // sequential
Collection.parallelStream() // parallel
Основные операции
forEach
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
map
List<Integer> squares = numbers.stream()
.map(i -> i*i).distinct().collect(Collectors.toList());
filter
long count = strings.stream().filter(s -> s.isEmpty()).count();
limit
random.ints().limit(10).forEach(...);
sorted
random.ints().limit(10).sorted().forEach(...);
Parallel processing
long count = strings.parallelStream().filter(s -> s.isEmpty()).count();
Легко переключаться между sequential и parallel.
Collectors
List<String> filtered = strings.stream()
.filter(s -> !s.isEmpty()).collect(Collectors.toList());
String merged = strings.stream()
.filter(s -> !s.isEmpty()).collect(Collectors.joining(", "));
Statistics
IntSummaryStatistics stats = numbers.stream().mapToInt(x -> x).summaryStatistics();
stats.getMax(); stats.getMin(); stats.getSum(); stats.getAverage();
Полный пример: Java 7 vs Java 8
Класс Java8Tester демонстрирует подсчёт пустых строк, строк длины 3, фильтрацию, объединение, квадраты, статистику, случайные числа — в стиле Java 7 (циклы) и Java 8 (Streams). Результаты идентичны, но код на Streams короче, читаемее и параллелизуется одной строчкой.
Результат (фрагмент)
Using Java 7: ...
Empty Strings: 2
Strings of length 3: 3
Filtered List: [abc, bc, efg, abcd, jkl]
Merged String: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
...
Using Java 8: ...
Empty Strings: 2
Strings of length 3: 3
Filtered List: [abc, bc, efg, abcd, jkl]
Merged String: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
...
Random Numbers (sorted): -1009474951 ... 1798939493
Empty Strings (parallel): 2
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Генерация случайных чисел в Java: Практическое руководство с Random и Math.random