В Java Streams API потоки данных (
Stream) начинают своё выполнение только при вызове терминального операции. Это ключевая особенность, которая отличает ленивые (lazy) промежуточные операции от жадных (eager) терминальных операций.🚩Промежуточные и терминальные операции
🟠Промежуточные операции (Intermediate Operations)
Промежуточные операции возвращают новый поток и не инициируют выполнение. Они являются ленивыми, то есть, они откладывают выполнение до тех пор, пока не будет вызвана терминальная операция. Примеры:
filter, map, sorted, distinct, flatMap, и т.д. Промежуточные операции составляют цепочку, которая настраивает конвейер обработки данных. Stream<String> stream = Stream.of("one", "two", "three")
.filter(s -> s.length() > 3)
.map(String::toUpperCase); 🟠Терминальные операции (Terminal Operations)
Терминальные операции запускают выполнение всего конвейера потоков. Они потребляют поток и возвращают либо результат, либо выполняют побочные действия. Примеры:
forEach, collect, reduce, count, findFirst, findAny, allMatch, noneMatch, и т.д. long count = stream.count(); // Запуск выполнения
🚩Пример
Рассмотрим пример, где промежуточные операции
filter и map не инициируют выполнение, а только настройку конвейера. Выполнение начинается только при вызове терминальной операции forEach. import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// Настройка конвейера операций
Stream<String> nameStream = names.stream()
.filter(name -> {
System.out.println("Filter: " + name);
return name.length() > 3;
})
.map(name -> {
System.out.println("Map: " + name);
return name.toUpperCase();
});
System.out.println("Before terminal operation");
// Терминальная операция, которая запускает выполнение
nameStream.forEach(name -> System.out.println("Final result: " + name));
System.out.println("After terminal operation");
}
}
🚩Ожидаемый вывод
Вывод на экран покажет, что промежуточные операции выполняются только при вызове терминальной операции.
Before terminal operation
Filter: Alice
Map: Alice
Final result: ALICE
Filter: Bob
Filter: Charlie
Map: Charlie
Final result: CHARLIE
Filter: David
Map: David
Final result: DAVID
After terminal operation
Ставь 👍 и забирай 📚 Базу знаний