Java 9 中的ofNullable方法 | foojay


从 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 方法不处理空对象。