簡體   English   中英

從java中的arraylist中刪除所有可選的空/空值

[英]Remove all Optional empty/null values from arraylist in 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);

還有其他更好的方法嗎?

使用Java9 ,您可以使用新添加的Optional::stream API執行此操作:

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

removeIf是最簡單的方法:

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

對於任何想要獲得一點樂趣或者更好地理解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. 第一個map函數將Optional [String]轉換為Optional [Stream [String]]。 因此,Stream String [Optional [Stream [String]]]被傳遞
  2. flatmap的“map”部分將每個Optional [Stream [String]]轉換為Stream [String]。 所有空的Optionals都被一個空的Stream替換。 現在我們有Stream [Stream [String]]。
  3. “flat”部分將Stream [Stream [String]]轉換為Stream [String]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM