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