为什么Spliterator <! - ? - >将NONNULL定义为特征?

时间:2015-04-01 20:49:13

标签: java null java-8 java-stream

javadoc of Spliterator(如果我理解正确的话,基本上是Stream背后的真正原因)定义了许多有意义的特征,例如SIZEDCONCURRENT,{ {1}}等等。

但它也定义了NONNULL;为什么呢?

我认为,如果开发人员尝试IMMUTABLE.sort()流,那么用户有责任确保这样做他/她将被正当地接受NPE ......

但是这个特征存在。为什么? SORTED本身的javadoc并未提及它的任何实际用法,Spliterator包的package-info.java也没有...

2 个答案:

答案 0 :(得分:3)

来自Spliterator的文档:

  

Spliterator还会报告characteristics()ORDEREDDISTINCTSORTED,{SIZEDNONNULLIMMUTABLE的一组结构,来源和元素。 {1}},CONCURRENTSUBSIZEDNullPointerException。 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, ...