Stream.empty的实际用途是什么



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的常量,这将提高性能,因为它将是可重用的。

最新更新