BitSet a une méthode stream() mais il n'implémente pas l'interface Iterable comme les autres types qui fournissent cette méthode. Y a-t-il une raison spécifique à cela?

10
Raffi Khatchadourian 24 janv. 2017 à 23:23

4 réponses

Meilleure réponse

Aucune des méthodes de Iterable (foreach, iterator et spliterator) n'est fournie dans BitSet. Il n'y a pas de méthode stream() dans Iterable.

De plus, la méthode stream() de BitSet ne renvoie pas de flux sur les bits de l'ensemble de bits, mais renvoie un flux sur les indices des bits dont les valeurs sont définies (qui est un peu déroutant TBH). Par conséquent, techniquement parlant, il semble n'y avoir presque rien en commun avec Iterable.

9
M Anouti 24 janv. 2017 à 21:14

BitSet n'est pas un "vrai" membre du framework de collecte Java, donc techniquement, pas besoin d'implémenter Collection.iterator() et d'en fournir un.

public class BitSet implements Cloneable, java.io.Serializable 

Plus précisément, les deux seraient mal assemblés.

Les BitSet ne sont pas génériques , contrairement à java.util.Iterator; BitSet fournit des méthodes ad hoc avec des fonctionnalités spéciales pour les effets secondaires et l'adressage aléatoire, contrairement à Iterator.

3
Fabien Benoit-Koch 24 janv. 2017 à 20:34

Probablement pour éviter de forcer chaque bit à une instance Boolean.

Le boucler en utilisant ses propres API évitera toutes les allocations.

-1
SLaks 24 janv. 2017 à 20:32

Une des raisons (peut-être pas toute la raison) est que Iterable serait inefficace, car les index de bits doivent être encadrés (*); le flux peut utiliser des entiers primitifs.

Il existe un moyen efficace d'itérer l'ensemble de bits sans utiliser Iterable, comme décrit dans Javadoc, donc ce n'est pas vraiment nécessaire.


(*) Cependant, pour les bitsets de taille 128 ou inférieure, la boxe serait bon marché, car des instances en boîte mises en cache seraient utilisées.

4
Andy Turner 10 févr. 2019 à 11:34