javadoc of Spliterator
(这基本上是 Stream
背后的真正含义,如果我理解正确的话)定义了许多有意义的特征,例如 SIZED
, CONCURRENT
, IMMUTABLE
等等
但它也定义了 NONNULL
;为什么?
虽然我认为用户有责任确保这一点,例如,如果开发人员试图 .sort()
一个非SORTED
有空元素的流,他/她会理所当然地受到 NPE 的欢迎......
但是这个特性是存在的。为什么? Spliterator
的 javadoc本身并没有提到它的任何实际用法,package-info.java
也没有提到。的 java.util.stream
包...
最佳答案
来自 Spliterator
的文档:
A Spliterator also reports a set of
characteristics()
of its structure, source, and elements from amongORDERED
,DISTINCT
,SORTED
,SIZED
,NONNULL
,IMMUTABLE
,CONCURRENT
, andSUBSIZED
. These may be employed by Spliterator clients to control, specialize or simplify computation.
请注意,它没有提到防止NullPointerException
。如果您对可能包含 null
值的 Stream
进行排序, 您有责任提供一个 Comparator
来处理 null
s.
第二句也明确表示使用这些标志只是一个选项,不是“Spliterator clients”的要求,它不限于Stream
s的使用。
因此,无论 Stream
API 的当前实现是否使用它,是否有可能利用有关 NONULL
特性的知识?
我是这么认为的。实现可以分支到非null
Spliterator
的专用代码,以利用null
表示特定状态,例如缺少值或处理第一个元素之前的初始值等。如果事实上,处理可能包含 null
的 Stream
的实际实现代码 是 复杂。但是,当然,您总是必须权衡一个案例的简化是否值得代码重复。
但有时简化就像知道没有 null
值一样简单,这意味着您可以使用 Concurrent...
集合之一,它不允许 null
,在内部。
关于java - 为什么 Spliterator<?> 将 NONNULL 定义为特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29400536/