Ваше решение не работает, потому что результат Optional
равен List
, и вы собираете его через Stream
конвейеры обратно к List
.
Используя Java 8 , вы можете обернуть все свои решения в Optional
или лучше использовать преимущество Collectors
вместо:
Optional<List<Employee>> o = Optional
.ofNullable(employees) // employees can be null, right?
.orElse(Collections.emptyList()) // ... if so, then empty List
.stream() // Stream<Employee>
.filter(Objects::nonNull) // Stream<Employee> filtered as non-nulls
.filter(e -> e.getType() != null) // Stream<Employee> with non-null field
.collect(Collectors.collectingAndThen(
Collectors.toList(), // Collected to List<Employee>
Optional::of)); // Collected to Optional<List<Employee>>
Метод Collectors::collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)
ведет себя как обычный коллектор, предоставляя последующую функцию отображения, получающую полученный результат. В нашем случае мы просто оборачиваем List
в Optional
для возврата.
- Collector
downstream
собирает в List<Employee>
- Функция
finisher
карты List<Employee>
до Optional<List<Employee>>
При Java 9 и выше при использовании Optional::stream
начало может быть немного другим:
Optional<List<Employee>> o = Optional
.ofNullable(employees) // null-safe employees
.stream() // Stream<List<Employees>>
.flatMap(List::stream) // Stream<Employees>
.filter(Objects::nonNull)
......