Порядок вызова операций в потоке stream (Java 8)

343
11 февраля 2017, 06:56

Есть следующий List<String>:

List<String> arrList = Arrays.asList("небо", "земля", "облако", "космос", "звезда", "галактика");

Создав поток stream, отфильтруем элементы (слова) с длиною меньше 6 символов, например, и подсчитаем количество этих элементов.

long count = arrList.stream().filter(w -> w.length() > 6).count();

В каком порядке реально выполняются операции filter() и count()? В том же в каком они следуют в данном выражении?

Answer 1

Порядок выполнения операций над стримами не изменяется. Но стоит учитывать, что операции делятся на два типа:

  • промежуточные (intermediate), например, filter, skip, peek и пр. Они каким-то образом изменяют входной поток.
  • конечные (terminal) операции, такие как count, forEach и пр. Эти операции имеют какой-то результат или side-effect.

Разница между первым и вторым типами заключается во времени выполнения. Т.е. промежуточные операции ленивы, и они будут вычисляться только лишь после дальнейшего вызова конечной операции.

Более подробнее здесь.

Answer 2

Порядок потоковых операций не соответствует тому порядку в котором они (операции) вызываются в потоках ввода-вывода. Сначала в методе count() запрашивается первый элемент, затем в методе filter() начинается опрашивание элементов до тех пор, пока не будет найден элемент длиной меньше 6 букв.

Источник: Кей С. Хорстманн - Java SE 8. Вводный курс

READ ALSO
TimePicker и системное время

TimePicker и системное время

Сделал собственную разметку и добавил виджет TimePicker и кнопку,которая будет сбрасывать время до текущего время системы

349
Связи в таблицах. ORM

Связи в таблицах. ORM

Довольно детский вопрос, но я запуталсяИспользую Hibernate

363
Java Вопрос по файлам и чтению их в массивы

Java Вопрос по файлам и чтению их в массивы

Простите, если путанно и многословно объясняю

299
Не округлять double до целого числа [дубликат]

Не округлять double до целого числа [дубликат]

На данный вопрос уже ответили:

339