it-swarm.com.ru

Удалить все необязательные пустые/нулевые значения из массива в Java

Мне нужно удалить все пустые/нулевые значения из List<Optional<String>>.

Пример:

List<Optional<String>> list = new ArrayList<>();

list.add(Optional.empty());
list.add(Optional.of("Str1"));
list.add(Optional.of("Str2"));
list.add(Optional.of("Str3"));
list.add(Optional.of("Str4"));
list.add(Optional.of("Str5"));
list.add(Optional.empty());
list.add(Optional.ofNullable(null));

В настоящее время я использую один из следующих подходов:

Способ 1:  

List<String> collect = list.stream()
                   .filter(Optional::isPresent)
                   .map(obj ->obj.get())
                   .collect(Collectors.toList());

Способ 2:  

List<Optional<String>> emptlist = new ArrayList<>();
emptlist.add(Optional.empty());
list.removeAll(emptlist);

Есть ли другой способ лучше?  

11
Niraj Sonawane

С помощью Java9 вы можете сделать это с помощью недавно добавленного API Optional::stream:

List<String> collect = list.stream()
               .flatMap(Optional::stream)
               .collect(Collectors.toList());

Этот метод можно использовать для преобразования Stream необязательных элементов в Stream элементов текущей стоимости.

Придерживаясь Java8, Way1 в вопросе достаточно хорош ИМХО -

List<String> collect = list.stream()
               .filter(Optional::isPresent)
               .map(Optional::get) // just a small update of using reference
               .collect(Collectors.toList());
8
nullpointer

removeIf самый короткий способ сделать это:

list.removeIf(x -> !x.isPresent());
8
Daniel Taub

Для тех, кто хочет немного повеселиться или лучше понять работу с Optionals и Streams (Java 8):

List<String> collect=list.stream().
                                   map(z->z.map(Stream::of)).
                                   flatMap(ox->ox.orElseGet(Stream::empty)).
                                   collect(Collectors.toList());
  1. Первая функция карты преобразует Optional [String] в Optional [Stream [String]]. Строка Stream [Необязательно [Stream [String]]], таким образом, передается вперед
  2. Часть «map» в flatmap преобразует каждый дополнительный [Stream [String]] в Stream [String]. Все пустые дополнительные функции заменяются пустым потоком. Теперь у нас есть Stream [Stream [String]].
  3. «Плоская» часть преобразует Stream [Stream [String]] в Stream [String]. 
0
Sumit Paroothi