Как преобразовать ArrayList в ArrayList <Test> - PullRequest
0 голосов
/ 10 июля 2020
 ArrayList<Optional<Test>> valueList= vv.values().stream().collect(Collectors.toList());
 

Я получаю значения в списке с ArrayList<Optional<Test>> в качестве типа возврата, но мне нужно преобразовать его в ArrayList<Test> без дополнительного типа возврата.

Как преобразовать От ArrayList<Optional<Test>> до ArrayList<Test> дюймов Java 8 или Java 7?

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

1. Использование filter ()

Один из вариантов в Java 8 - отфильтровать значения с помощью Optional::isPresent, а затем выполнить сопоставление с помощью функции Optional::get для извлечения значения:

ArrayList<Test> testlist = valueList.stream()
  .filter(Optional::isPresent)
  .map(Optional::get)
  .collect(Collectors.toList());

2. Использование flatMap ()

Другой вариант - использовать flatMap с лямбда-выражением, которое преобразует пустое значение Optional в пустой экземпляр Stream и непустой Optional для экземпляра Stream, содержащего только один элемент:

ArrayList<Test> testlist = valueList.stream()
  .flatMap(t -> t.isPresent() ? Stream.of(t.get()) : Stream.empty())
  .collect(Collectors.toList());

Вы можете применить тот же подход, используя ссылку на метод для преобразования Optional в Stream:

ArrayList<Test> testlist = valueList.stream()
  .flatMap(t -> t.map(Stream::of).orElseGet(Stream::empty))
  .collect(Collectors.toList());

3. Java 9 Optional :: stream

В Java 9 метод stream () был добавлен в класс Optional для улучшения его функциональности. аналогично показанному в разделе 2, но на этот раз мы используем предопределенный метод для преобразования экземпляра Optional в экземпляр Stream. Если Optional содержит значение, то верните Stream, содержащий это значение. В противном случае возвращается пустой поток.

ArrayList<Test> testlist = valueList.stream()
  .flatMap(Optional::stream)
  .collect(Collectors.toList());
2 голосов
/ 10 июля 2020

Используя Java 8 Streams, вы можете сделать это следующим образом:

    public static <T> List<T> unpackOptionals(List<Optional<T>> listOfOptionals) {
        return listOfOptionals.stream()
              .filter(Optional::isPresent)
              .map(Optional::get)
              .collect(Collectors.toList());
    }

Используя Java 9 или выше, вы можете использовать метод Optional.stream() для выполнения работы:

    public static <T> List<T> unpackOptionals(List<Optional<T>> listOfOptionals) {
        return listOfOptionals.stream()
              .flatMap(Optional::stream)
              .collect(Collectors.toList());
    }

В Java 7 не должно быть Optional (они были добавлены в Java 8)

...