Supposons que set
est un HashSet
avec n
éléments et que k
est un int
compris entre 0
(inclus) et n
(exclusif).
Quelqu’un peut-il expliquer, en termes simples, ce qui se passe réellement lorsque vous faites cela?
set.stream().skip(k).findFirst();
En particulier, quelle est la complexité temporelle de cela? L’ajout de spliterator()
à l’interface Collection
signifie-t-il que nous avons maintenant un access plus rapide aux éléments “aléatoires” des collections que ce n’aurait été possible avec Java 7?
L’implémentation actuelle a une complexité de O (k) et un équivalent sans défaut des éléments suivants:
Iterator> it = set.iterator(); for(int i=0; i
L'implémentation actuelle ne prend jamais en compte la caractéristique ORDERED
pour les stream séquentiels. L'élément de code cité dans la réponse @ the8472 fonctionne uniquement pour les stream parallèles. En parallèle, la complexité amortie est approximativement égale à O (k / n), n étant le nombre de processeurs.
Comme louis mentionne skip n’a pas vraiment de sens sur les stream non ordonnés, en fait, il est actuellement (jdk 1.8) mis en œuvre de manière à ce que la méthode suivante optimise le saut dans certaines circonstances:
Spliterator unorderedSkipLimitSpliterator(Spliterator s, long skip, long limit, long sizeIfKnown) { if (skip <= sizeIfKnown) { // Use just the limit if the number of elements // to skip is <= the known pipeline size limit = limit >= 0 ? Math.min(limit, sizeIfKnown - skip) : sizeIfKnown - skip; skip = 0; } return new StreamSpliterators.UnorderedSliceSpliterator.OfRef<>(s, skip, limit); }
Ceci est valide car cela équivaut à parcourir simplement la collection source dans un ordre différent.