BitSet
имеет метод stream()
, но он не реализует интерфейс Iterable
, как и другие типы, которые предоставляют этот метод. Есть ли конкретная причина для этого?Почему BitSet не Iterable?
ответ
Ни один из методов в Iterable
(foreach
, iterator
и spliterator
) не предусмотрено в BitSet
. В Iterable
нет метода stream()
.
Кроме того, stream()
метод BitSet
не возвращает поток над битами набора бит, но возвращает поток над индексов битов, значения которых установлены (что-то в заблуждение ТВН). Поэтому, технически говоря, с Iterable
почти нет ничего общего.
Возможно, чтобы избежать дорогого бокса каждый бит до экземпляра Boolean
.
Зацикливание по нему с использованием собственных API позволит избежать всех распределений.
может быть примитивным коротким, я думаю –
@fabienbk: Нет; Java не поддерживает примитивные дженерики. – SLaks
Бокс для булева действительно дешевый: их всего два, и они кэшируются. 'Stream' возвращает' int ', представляющий установленные битовые индексы; Я думаю, что OP ожидает, что 'Iterable' будет делать то же самое (кроме' Integer'). –
BitSet
не является «истинным» членом рамки коллекции java, поэтому технически нет необходимости реализовывать Collection.iterator()
и предоставить его.
public class BitSet implements Cloneable, java.io.Serializable
Более конкретно, оба будут плохо приспособлены togethoer.
BitSet не общий, в отличие от java.util.Iterator; BitSet предоставляет специальные методы со специальными функциями для побочных эффектов и случайной адресации, в отличие от Iterator.
Одна из причин (не вся причина, может быть) заключается в том, что Iterable
будет неэффективным, поскольку бит-индексы должны быть помещены в бокс; поток может использовать примитивные ints.
Существует эффективный способ итерации битового набора без использования Iterable
, как описано в Javadoc, поэтому это не обязательно.
О, хорошая точка. Я отредактирую свой вопрос. –