简体   繁体   English

从java中的arraylist中删除所有可选的空/空值

[英]Remove all Optional empty/null values from arraylist in java

I need to remove all empty/null values from List<Optional<String>> . 我需要从List<Optional<String>>删除所有空/空值。

Example: 例:

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));

Currently, I'm using one of the below approaches: 目前,我正在使用以下方法之一:

Way 1: 方式1:

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

Way 2: 方式2:

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

Is there any other better way? 还有其他更好的方法吗?

With Java9 , you can do this using the newly added Optional::stream API : 使用Java9 ,您可以使用新添加的Optional::stream API执行此操作:

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

This method can be used to transform a Stream of optional elements to a Stream of present value elements . 此方法可以用来变换Stream的可选元素的一个Stream现值的元素

Sticking with Java8 , the Way1 in the question is good enough IMHO - 坚持使用Java8 ,问题中的Way1已经足够恕我直言 -

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

removeIf是最简单的方法:

list.removeIf(x -> !x.isPresent());

For anyone who wants to have a little fun or understand working of Optionals and Streams better (Java 8): 对于任何想要获得一点乐趣或者更好地理解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. The first map function converts Optional[String] to Optional [Stream[String]]. 第一个map函数将Optional [String]转换为Optional [Stream [String]]。 A Stream String[Optional [Stream[String]]] is thus passed forward 因此,Stream String [Optional [Stream [String]]]被传递
  2. The "map" part of flatmap converts each Optional[Stream[String]] to Stream[String]. flatmap的“map”部分将每个Optional [Stream [String]]转换为Stream [String]。 All empty Optionals are replaced by an empty Stream. 所有空的Optionals都被一个空的Stream替换。 Now we have Stream[Stream[String]]. 现在我们有Stream [Stream [String]]。
  3. The "flat" part converts Stream[Stream[String]] to Stream[String]. “flat”部分将Stream [Stream [String]]转换为Stream [String]。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM