Как использовать Optional.ofNullable и Stream - PullRequest
0 голосов
/ 22 января 2020

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

List<String> list1 = List.of("abc","abc");
Optional.ofNullable(list1).stream().flatMap(List::stream).map(e -> e.concat("def")).collect(Collectors.toList());

List<String> list2 = List.of("abc","abc");
Stream<String> stream = Optional.ofNullable(list2).map(List::stream).orElseGet(Stream::empty);
stream.map(e-> e.concat("def")).collect(Collectors.toList());

Мой вопрос, почему на В первом примере я использую flatMap и map , а во втором я использую две map * , чтобы выполнить ту же работу. Если я попытаюсь использовать две карты в первом примере, это не сработает.

1 Ответ

2 голосов
/ 22 января 2020

Чтобы понять, что происходит, можно посмотреть на все типы возвращаемых данных:

Первый пример:

List<String> list1 = List.of("abc","abc");

List<String> result = 
    Optional.ofNullable(list1)          // Optional<List<String>>
        .stream()                       // Stream<List<String>>
        .flatMap(List::stream)          // Stream<String>
        .map(e -> e.concat("def"))      // Stream<String>
        .collect(Collectors.toList());  // List<String>

В этом примере вы go прямо от Optional<List<String>> до Stream<List<String>>, а затем используйте методы последнего интерфейса. Используемые здесь методы (по порядку):

  1. Optional#ofNullable(T)
  2. Optional#stream()
  3. Stream#flatMap(Function)
  4. Stream#map(Function)
  5. Stream#collect(Collector)

Второй пример:

List<String> list2 = List.of("abc","abc");

List<String> result =
    Optional.ofNullable(list2)          // Optional<List<String>>
        .map(List::stream)              // Optional<Stream<String>>
        .orElseGet(Stream::empty);      // Stream<String>
        .map(e-> e.concat("def"))       // Stream<String>
        .collect(Collectors.toList());  // List<String>

В этом примере вы go из Optional<List<String>> в Optional<Stream<String>> (еще один необязательный) и затем извлекаете Stream<String> через Optional#orElseGet(Supplier). После этого вы используете методы интерфейса Stream. Используемые здесь методы (по порядку):

  1. Optional#ofNullable(T)
  2. Optional#map(Function)
  3. Optional#orElseGet(Supplier)
  4. Stream#map(Function)
  5. Stream#collect(Collector)
...