Spliterator定义了许多有意义的特征,比如SIZED、CONCURRENT、IMMUTABLE等。
但是它也定义了NONNULL;为什么?
不过,我认为用户有责任确保这一点,例如,如果开发人员试图在有空元素的情况下.sort()非SORTED流,那么他/她理应得到NPE的欢迎。
但这样的特性就存在了。为什么?Spliterator的javadoc本身没有提到它的任何实际用法,java.util.stream包的package-info.java也没有提到.
发布于 2015-04-02 09:15:37
来自Spliterator的文档
分配器还报告了一组来自
characteristics()的ORDERED、DISTINCT、SORTED、SIZED、NONNULL、IMMUTABLE、CONCURRENT和SUBSIZED中的结构、源和元素。Spliterator客户端可以使用这些工具来控制、专门化或简化计算。
请注意,它没有提到NullPointerException的预防。如果对可能包含null值的Stream进行排序,则提供能够处理null的Comparator是您的责任。
第二句还明确指出,使用这些标志只是一种选择,而不是对“Spliterator客户端”的要求,这并不限于Stream的使用。
因此,不管Stream API的当前实现是否使用它,是否有可能获得有关NONULL特性的知识的优势?
我也这么想。实现可以分支到非null Spliterator的专用代码,以便利用null来表示特定状态,例如在处理第一个元素之前缺少值或初始值等。如果事实如此,用于处理可能包含null的Streams的实际实现代码是复杂的。但是,当然,您总是需要权衡简化一种情况是否证明代码重复是合理的。
但有时简化就像知道没有null值意味着您可以在内部使用一个不允许null的Concurrent…集合一样简单。
发布于 2015-04-01 22:11:35
我在枚举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, ...https://stackoverflow.com/questions/29400536
复制相似问题