我正在考虑这个问题的答案:如何在任何 Java 地图实现上测试空键?
我的第一个想法是检查Spliterator地图的键集是否具有以下特征Spliterator.NONNULL:
map.keySet().spliterator().hasCharacteristics(Spliterator.NONNULL)
JavaDoc说:
表示源保证遇到的元素不会为空的特征值。(例如,这适用于大多数并发集合、队列和映射。)
在回答之前我做了一些检查:
没有提供的 Spliteratora不具有此特征,即使自然排序不允许空键。TreeMapCompararator
new TreeMap<>().keySet().spliterator().hasCharacteristics(Spliterator.NONNULL); // false
更令人惊讶的是,键集Spliterator的 s本身并没有这个特性。EnumMapEnumSet
EnumSet.allOf(DayOfWeek.class).spliterator().hasCharacteristics(Spliterator.NONNULL); // false
我知道spliterator().hasCharacteristics(Spliterator.NONNULL)在上述情况下的结果返回false为默认实现Set.spliterator()被评估。
但是,这些集合的拆分器不覆盖Set.spliterator()创建Spliteratorwith是否有原因Spliterator.NONNULL?这会破坏我不知道的规范吗?