Stream#empty
返回一个空的连续Stream
。从本教程中,我了解到,在调用具有流参数的方法时,空流可能有助于避免空指针异常。然而,我想不出一个例子可以帮助我清楚地理解这一说法。
假设您有一个Stream
和一个包含一些逻辑的flatMap
操作,如果满足某些条件,您希望调用Stream#empty
的可能性
listOfLists.stream().flatMap(list -> {
// complex business logic, maybe even extracted in another method
return xxx ? someList.stream() : Stream.empty();
});
另一个例子是,就像Optional<T>
在方法返回Stream<T>
(比方说工厂方法(的情况下使返回更安全一样
public <T> Stream<T> makeFooStreamFrom(Object... parameters) {
// decide on what to do based on the parameters
return decisionMadeToReturnAnEmptyStream ? Stream.empty() : Stream.of(foo, bar);
}
关于接受Stream
参数的方法的例子,可以给出一个很好的例子,比如这个
public <T> void consumeStream(@NotNull Stream<T> stream) {
// In this example, if this stream is null, you'll get a NullPointerException
// However, if you make sure to invoke this method using Stream#empty
// No need to worry about it
// This is the security that Stream#empty will provide in this case
stream.map(...).filter(...).forEach(...);
}
@daniu带来的第四个例子是当您有一个可以为null的List
时。这在java-9之前是最相关的,因为java-9引入了Stream#ofNullable
,BTW在内部也使用Stream#empty
这是它的实现,也是的第四个例子
public static<T> Stream<T> ofNullable(T t) {
return t == null ? Stream.empty()
: StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
我们认为上面的例子并不相关,因为它无论如何都会返回一个Stream
,但底层实现在内部使用了一个名为EMPTY_SPLITERATOR
的常量,这将提高性能,因为它将是可重用的。