Java проверка нуля списка перед потоком и возврат как необязательный - PullRequest
1 голос
/ 09 января 2020

Я получаю список объектов из API

public Optional<List<Employee>> getEmployeeData (String deptId){

     List<Employee> employee = departmentClient.employeeData(deptId);

     //Based on some condition I am filtering employee list but before that I want to check  for null for list.

    return Optional.ofNullable(employee).orElse(Collections.emptyList())
            .stream()
            .filter(Objects::nonNull)
            .filter(e -> e.getType != null)
            .collect(Collectors.toList());

 }

Но я думаю, что тип возвращаемого метода - Optional<>, что приводит к ошибке. Как я могу проверить NULL для List до Stream и вернуться как Optional<List<..>>

Ответы [ 3 ]

3 голосов
/ 10 января 2020

И еще одна опция:

return Optional.ofNullable(employee)
        .map(list -> list.stream()
                .filter(Objects::nonNull)
                .filter(e -> e.getType() != null)
                .collect(Collectors.toList()));

Лямбда внутри .map(...) выполняется только в том случае, если список emploee не равен нулю, в противном случае возвращается пустой Optional.

3 голосов
/ 10 января 2020

Вы вернули List<Employee>, в то время как подпись вашего метода Optional<List<Employee>>

Попробуйте это:

return employee != null ? Optional.of(employee.stream()
            .filter(Objects::nonNull)
            .filter(e -> e.getType != null)
            .collect(Collectors.toList())) : Optional.ofNullable(Collections.emptyList());
2 голосов
/ 10 января 2020

Ваше решение не работает, потому что результат 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) 
        ......
...