Java 9 中的ofNullable方法 | foojay

banq發表於2021-07-06

從 Java 9 開始,當我們需要操作 List 中的值時,可以將 Optional 與流一起使用。
在本次 Java 挑戰賽中,我們將探索在 Optional! 中使用流的方法!
如下執行main方法後會發生什麼?

import java.util.List;
import java.util.stream.Stream;

public class OfNullableChallenger {

    public static void main(String... args) {
        Soprano soprano = null;

        Stream.ofNullable(soprano)
        .filter(s -> s.guns.get(0) == null)
        .forEach(s -> System.out.println(s.guns.size()));
    }

    static class Soprano {
        List<String> guns;

        public Soprano(List<String> guns) {
            this.guns = guns;
        }
    }
}
A) 0
B) 輸出將為空
C) 將丟擲 java.lang.NullPointerException
D) null


我們使用的是 Java 9 中的 ofNullable 方法。使用此方法,可以在傳遞空物件時避免 NullPointerException。
現在我們來分析一下ofNullable的方法實現:

public static Stream ofNullable(T t) {
       return t == null ? Stream.empty() : StreamSupport.stream(
                                    new Streams.StreamBuilderImpl<>(t), false);
}

如果物件為空,則將返回 Stream.empty() ,並且如前所述將避免 NullPointerException ,因此輸出將為空。Stream 管道在此之後甚至不會繼續。
但是如果我們使用 Stream.of() 方法,例如:

Stream.of(soprano)
        .filter(s -> s.guns.get(0) == null)
        .forEach(s -> System.out.println(s.guns.size()));

則會有一個NullPointerException,因為 Stream.of 方法不處理空物件。
 

相關文章