2017-01-24 23 views
8

BitSet имеет метод stream(), но он не реализует интерфейс Iterable, как и другие типы, которые предоставляют этот метод. Есть ли конкретная причина для этого?Почему BitSet не Iterable?

ответ

7

Ни один из методов в Iterable (foreach, iterator и spliterator) не предусмотрено в BitSet. В Iterable нет метода stream().

Кроме того, stream() метод BitSet не возвращает поток над битами набора бит, но возвращает поток над индексов битов, значения которых установлены (что-то в заблуждение ТВН). Поэтому, технически говоря, с Iterable почти нет ничего общего.

+0

О, хорошая точка. Я отредактирую свой вопрос. –

-1

Возможно, чтобы избежать дорогого бокса каждый бит до экземпляра Boolean.

Зацикливание по нему с использованием собственных API позволит избежать всех распределений.

+0

может быть примитивным коротким, я думаю –

+1

@fabienbk: Нет; Java не поддерживает примитивные дженерики. – SLaks

+2

Бокс для булева действительно дешевый: их всего два, и они кэшируются. 'Stream' возвращает' int ', представляющий установленные битовые индексы; Я думаю, что OP ожидает, что 'Iterable' будет делать то же самое (кроме' Integer'). –

3

BitSet не является «истинным» членом рамки коллекции java, поэтому технически нет необходимости реализовывать Collection.iterator() и предоставить его.

public class BitSet implements Cloneable, java.io.Serializable 

Более конкретно, оба будут плохо приспособлены togethoer.

BitSet не общий, в отличие от java.util.Iterator; BitSet предоставляет специальные методы со специальными функциями для побочных эффектов и случайной адресации, в отличие от Iterator.

3

Одна из причин (не вся причина, может быть) заключается в том, что Iterable будет неэффективным, поскольку бит-индексы должны быть помещены в бокс; поток может использовать примитивные ints.

Существует эффективный способ итерации битового набора без использования Iterable, как описано в Javadoc, поэтому это не обязательно.

 Смежные вопросы

  • Нет связанных вопросов^_^