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

标签 java null java-8 java-stream

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 among ORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT, and SUBSIZED. These may be employed by Spliterator clients to control, specialize or simplify computation.

请注意,它没有提到防止NullPointerException。如果您对可能包含 null 值的 Stream 进行排序, 您有责任提供一个 Comparator 来处理 nulls.

第二句也明确表示使用这些标志只是一个选项,不是“Spliterator clients”的要求,它不限于Streams的使用。


因此,无论 Stream API 的当前实现是否使用它,是否有可能利用有关 NONULL 特性的知识?

我是这么认为的。实现可以分支到非null Spliterator 的专用代码,以利用null 表示特定状态,例如缺少值或处理第一个元素之前的初始值等。如果事实上,处理可能包含 nullStream 的实际实现代码 复杂。但是,当然,您总是必须权衡一个案例的简化是否值得代码重复。

但有时简化就像知道没有 null 值一样简单,这意味着您可以使用 Concurrent... 集合之一,它不允许 null,在内部。

关于java - 为什么 Spliterator<?> 将 NONNULL 定义为特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29400536/

相关文章:

Java 正则表达式 : Replace part of source string

c# - 空传播运算符和 foreach

java - Char 数组索引不接受

java - 尝试在 Mac 上安装 Android Studio 时出现“无法安装文件系统”错误

lambda - 使用 lambda 提供基于堆栈的上下文(例如文件操作的路径)

Java Swing UI 对齐问题

java - 如何更改 Android EditText 中的默认键盘输入语言

java - HTTP SSL 相互身份验证代码在 Apache HTTPClient 4.0.1 中有效,但在 4.1 中失败

sql - 合并两列并添加到一个新列中

java - 尝试对 Java 8 parallelSetAll() 与 setAll() 进行基准测试