Почему этот код не выполняется?
list.stream().mapToLong(A::getB).filter(Objects::nonNull).sum();
Поскольку операции с потоками выполняются последовательно.Поэтому, если для какого-либо элемента потока A::getB
не возвращает ненулевое Long
, во время сбора будет сгенерировано исключение.
Почему это удается?
list.stream().filter(a -> a.getB()!=null).mapToLong(A::getB).sum();
Поскольку первый выполненный filter()
удаляет нулевые элементы, полученные в результате операций a::getB
.Таким образом, вы добавляете только ненулевые элементы в поток собиратьТак что не исключение.Но проблема в том, что вы выполняете двойное отображение a::getB
.Дублировать и так беспомощно, даже если здесь это не дорого (просто получатель).
То, что вы хотите:
list.stream()
.map(A::getB) // return Stream<Long> that may contain null
.filter(Objects::nonNull) // filter null elements
.mapToLong(s->s) // map Long to long
.sum(); // sum