Может ли Java Stream.collect () вернуть значение null? - PullRequest
0 голосов
/ 09 мая 2018

JavaDoc для Stream.collect () говорит, что возвращает the result of the reduction. Это не говорит мне, может ли подобный код вернуть null для FilterList:

List<String> filteredList = inputList.stream().
filter(c -> c.getSomeBoolean()).
flatMap(c -> {
  List<String> l = new ArrayList<String>();
  l.add(c.getSomething());
  l.add(c.getSomethingElse());
  return l.stream();
}).
filter(s -> StringUtils.isNotBlank(s)).
collect(Collectors.toList());

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

Задокументировано ли где-нибудь, может ли Stream.collect () вернуть null?

Ответы [ 4 ]

0 голосов
/ 09 мая 2018

Я думаю, что эта часть документации говорит, что она не может быть нулевой:

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

Основные моменты , добавленные мной. Я думаю, что новый список означает, что что-то не является нулевым.

Я начал проверять ReferencePipeline.collect(), чтобы проверить, верно ли это для фактической реализации. К сожалению, это была тщетная попытка. Здесь так много случаев, как это параллельно? это после forEach? и т.д.

0 голосов
/ 09 мая 2018

Это зависит от коллектора. Тот, который вы используете (Collectors.toList ()), возвращает пустой список.

0 голосов
/ 09 мая 2018

Это не зависит от Stream.collect, но от индивидуального Collector.Collectors.toList() вернет пустое ArrayList.

Тем не менее, нет причины, по которой кто-то не мог бы использовать странный Collector для возврата нуля при определенных обстоятельствах:

.collect(
    Collector.of(
        ArrayList::new,
        ArrayList::add,
        (a, b) -> {
            a.addAll(b);
            return a;
        },
        a -> a.isEmpty() ? null : a  // finisher replaces empty list with null
    )
);

ИтакCollector - это то, что вам нужно запомнить, чтобы проверить.Я полагаю, что все Collectors доступные из коробки вернут пустые коллекции, как и следовало ожидать.

0 голосов
/ 09 мая 2018

Collector.toList() вернет вам пустой список.

Вот реализация:

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);
}

Как видите, ArrayList::new используется в качестве контейнера для ваших предметов.


Редактировать

Я вижу здесь много сомнений, поэтому я прочитал JavaDoc и поделился с вами:

Из JavaDoc Сборщик :

открытый интерфейс Collector

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

Коллектор определяется четырьмя функциями, которые работают вместе для накапливать записи в изменяемый контейнер результатов и, при необходимости, выполнить окончательное преобразование результата. Это:

  • создание нового контейнера результатов (поставщик ())

  • включение нового элемента данных в контейнер результатов (аккумулятор ())

  • объединение двух контейнеров результатов в один (combiner ())
  • выполнение необязательного финального преобразования для контейнера (финишер ())

И

Последовательная реализация сокращения с использованием коллектора создать отдельный контейнер результатов с помощью функции поставщика и вызвать функцию аккумулятора один раз для каждого элемента ввода. параллельная реализация разделит входные данные, создаст результат контейнер для каждого раздела , накапливайте содержимое каждого разделить подрезультат для этого раздела, а затем использовать функция объединения для объединения подрезультатов в объединенный результат.

Так что, пока вы не делаете странные вещи, такие как возвращение функции объединения null, Collector всегда возвращает по крайней мере mutable container, используя предоставленную вам функцию supplier.

И я думаю, что это очень нелогично, если реализация когда-нибудь вернет null контейнер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...