Потоковая операция Java 8 в пустом списке - PullRequest
0 голосов
/ 03 февраля 2019

Мне просто интересно, как будет вести себя Java 8 stream в пустом списке.

List<?> emptyList = new ArrayList<>();
List<?> processedList = emptyList.stream().collect(Collectors.toList());

Это будет пустой список или null?

Я знаю, streams делают ленивое распространение, поэтому в этом случае вызовет метод go collect() или просто он закончится методом stream()?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Вы получите пустую коллекцию.Как collect объяснено в doc :

Выполняет изменяемую операцию сокращения элементов этого потока, используя Collector.

и изменяемое сокращение :

Операция изменяемого сокращения собирает входные элементы в изменяемый контейнер результатов, такой как Collection или StringBuilder, так как обрабатывает элементы в потоке.

Вы получите пустую коллекцию, потому что исходный ввод пуст или из-за операции фильтрации.

Спасибо за подсказки @Andy Turner.

Тот факт, что toList () накапливается в новом списке, означает, что он не возвращает ноль.

И документ получает объяснение для Collectors.toList () следующим образом:

Возвращает Collector, который накапливает входные элементы в новый список.

Мы можем получить из исходного кода

    public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }

, что он никогда не будетсделать нулевой вывод, но вы все равно можете получить нульВсе с настроенным коллекционером, как показывает Энди.

0 голосов
/ 03 февраля 2019

collect является терминальной операцией, поэтому ее необходимо оценить.

При завершении Stream конвейера с помощью collect(Collectors.toList()) вы всегда получите вывод List (вы никогда не получите null).Если Stream является пустым (и не имеет значения, является ли он пустым из-за того, что источник потока пуст или из-за того, что все элементы потока отфильтрованы до операции терминала), вывод List тоже будет пустым.

...