Java的Collectors.toSet()是否保证允许空值?
Set
接口不承诺实现是否允许元素。每个实现都应该在其文档中声明这一点。null
Collectors.toSet()
承诺返回 的实现,但显式地“不保证返回的类型、可变性、可序列化性或线程安全性”。没有提到空安全。Set
Set
OpenJDK 中 的当前实现始终使用 ,这允许空元素,但这将来可能会更改,其他实现可能会有所不同。Collectors.toSet()
HashSet
如果一个实现禁止元素,它会在不同的时间抛出,特别是在尝试 add(null) 期间
。看起来,如果决定使用空不容许的实现,在 a 上调用 stream.collect(Collectors.toSet())
会抛出。的规范未列出任何异常,任何收集器
方法的规范也未列出。这可能表明调用允许在 中空值,但另一方面,尚不清楚这实际上是否意味着很多,因为这是一个未经检查的例外,并且不必严格列出。Set
null
NullPointerException
Collectors.toSet()
Set
Stream stream
collect
collect
stream
NullPointerException
这是否在其他任何地方都更清楚地指定?特别是,以下代码是否保证不会抛出?它保证返回吗?true
import java.util.stream.*;
class Test {
public static boolean setContainsNull() {
return Stream.of("A", "list", "of", null, "strings")
.collect(Collectors.toSet())
.contains(null);
}
}
如果没有,那么我认为我们应该始终确保流在使用之前不包含空值,或者准备处理。(不过,仅此例外就足够了吗?或者,当这是不可接受的或困难的,我们可以使用这样的代码请求特定的集合实现。Collectors.toSet()
NullPointerException
Collectors.toCollection(HashSet::new)
编辑:有一个现有的问题听起来表面上相似,这个问题被关闭了,因为它的假设重复。但是,链接的问题根本没有解决。此外,这个问题的答案构成了我问题的基本假设。这个问题问:流中是否允许空值?是的。但是,当通过标准收集器收集包含 null 的(完全允许的)流时会发生什么?Collectors.toSet()