Дополнительные возможности Java 8, объединение операторов

Я новичок в дополнительных параметрах Java 8, и мне интересно, есть ли способ объединить эти два оператора в один, сохранив при этом необязательный?

public List<String> getEmployeeStreetNames(Employee employee){
     List<Addresses> addresses = Optional.ofNullable(employee)
     .map(Employee::getAddresses)
      .orElse(new ArrayList<>());

   return addresses.stream()
       .map(Address::getStreetName)
       .collect(Collectors.toList())
}

Любая помощь приветствуется.


person Community    schedule 07.08.2020    source источник
comment
Я хотел бы отметить одну вещь: в таком случае я бы не использовал Optional.ofNullable и, возможно, вообще не использовал бы Optional. Я бы просто сказал, что вы не можете назвать это пустым сотрудником, глупо, и позволить NPE произойти; если employee.addresses не может быть нулевым (например, вы используете разумное правило, что оно может быть пустым, но не нулевым), тогда вы можете просто начать все это дело с employee.getAddresses().stream().   -  person chrylis -cautiouslyoptimistic-    schedule 08.08.2020
comment
@chrslis-cautiouslyoptimistic Я предлагаю вам ответить на ваш мудрый комментарий,   -  person Basil Bourque    schedule 08.08.2020


Ответы (1)


Во-первых, избегайте создания новых объектов на таких этапах конвейера, как orElse; вы всегда несете накладные расходы на создание параметра, даже если он не используется. Предпочитайте подписи типа Supplier<T> или, в данном случае, Collections.emptyList(). (Это особенно важно для исключений; всегда используйте MyException::new или () -> new MyException(foo).)

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

return Optional.ofNullable(employee)
    .map(Employee::getAddresses)
    .map(a -> a.stream().map(Address::getStreetName).collect(toList()))
    .orElse(emptyList());

return Optional.ofNullable(employee)
    .map(Employee::getAddresses)
    .orElse(emptyList())
    .stream()
    .map(Address::getStreetName)
    .collect(toList());

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

person chrylis -cautiouslyoptimistic-    schedule 07.08.2020
comment
Спасибо большое! Я очень ценю это :) - person ; 08.08.2020
comment
Или с Java 9: ​​Stream.ofNullable(employee) .flatMap(e -> e.getAddresses().stream()) .map(Address::getStreetName) .collect(toList()); (при условии, что getAddresses() никогда не возвращает null). - person Holger; 12.08.2020