为什么 BitSet 不可迭代?

Why is BitSet not Iterable?

BitSet 有一个 stream() 方法,但它不像其他提供此方法的类型那样实现 Iterable 接口。这有什么具体原因吗?

可能是为了避免将每一位都昂贵地装箱到 Boolean 实例。

使用它自己的 API 对其进行循环将避免所有分配。

Iterableforeachiteratorspliterator)中的方法

None 在 BitSet 中提供。 Iterable中没有stream()方法。

此外,BitSetstream() 方法不是 return 比特集的比特流,而是 return 其值被设置的位的索引(这有点令人困惑TBH)。因此,从技术上讲,似乎与 Iterable.

几乎没有任何共同之处。

BitSet 不是 java 集合框架的 "true" 成员,因此从技术上讲,无需实施 Collection.iterator() 并提供一个。

public class BitSet implements Cloneable, java.io.Serializable 

更重要的是,两者 ill-fitted 在一起。

BitSet 不是 通用的 ,不像 java.util.Iterator;与 Iterator 不同,BitSet 提供了 ad-hoc 方法,具有针对 side-effects 和随机寻址的特殊功能。

一个原因(可能不是全部原因)是 Iterable 效率低下,因为位索引必须装箱 (*);流能够使用原始整数。

有一种无需使用 Iterable 即可迭代位集的有效方法,如 Javadoc 中所述,因此并非真正必要。


(*) 但是,对于大小为 128 或更小的位集,装箱会很便宜,因为将使用缓存的装箱实例。