javadoc of Spliterator
(如果我理解正确的话,基本上是Stream
背后的真正原因)定义了许多有意义的特征,例如SIZED
,CONCURRENT
,{ {1}}等等。
但它也定义了NONNULL
;为什么呢?
我认为,如果开发人员尝试IMMUTABLE
非.sort()
流,那么用户有责任确保这样做他/她将被正当地接受NPE ......
但是这个特征存在。为什么? SORTED
本身的javadoc并未提及它的任何实际用法,Spliterator
包的package-info.java
也没有...
答案 0 :(得分:3)
来自Spliterator
的文档:
Spliterator还会报告
characteristics()
,ORDERED
,DISTINCT
,SORTED
,{SIZED
,NONNULL
中IMMUTABLE
的一组结构,来源和元素。 {1}},CONCURRENT
,SUBSIZED
和NullPointerException
。 Spliterator客户端可以使用它们来控制,专门化或简化计算。
请注意,它不提及Stream
的预防。如果您对可能包含null
值的Comparator
进行排序,那么 您有责任提供可以处理null
的{{1}}。
第二句也清楚地表明,使用这些标志只是一种选择,而不是“Spliterator客户”的要求,这不仅限于Stream
的使用。
因此,无论当前Stream
API的实现是否使用它,是否有可能获得有关NONULL
特征的知识?
我是这么认为的。实现可以分支到非null
Spliterator
的专用代码,以利用null
来表示某些状态,例如,在处理第一个元素之前缺少值或初始值等。事实上,处理可能包含Stream
的null
的实际实现代码是复杂的。但是,当然,你总是需要权衡一个案例的简化是否证明代码重复是正确的。
但有时简化就像知道没有null
值意味着你可以在内部使用Concurrent…
集合之一那些不允许null
s一样简单
答案 1 :(得分:0)
我在枚举StreamOpFlag
的代码中找到了以下注释。
// The following Spliterator characteristics are not currently used but a
// gap in the bit set is deliberately retained to enable corresponding
// stream flags if//when required without modification to other flag values.
//
// 4, 0x00000100 NONNULL(4, ...
// 5, 0x00000400 IMMUTABLE(5, ...
// 6, 0x00001000 CONCURRENT(6, ...
// 7, 0x00004000 SUBSIZED(7, ...