web-dev-qa-db-fra.com

Collectors.toSet () et HashSet

Prenez la ligne suivante de code exemple:

Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet());

Je veux un HashSet. En prenant un débogueur dans le code, je reçois effectivement un HashSet. J'ai jeté un œil à Java.util.stream.Collectors.toSet() pour observer le code suivant:

public static <T> Collector<T, ?, Set<T>> toSet() {
    return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
                               (left, right) -> { left.addAll(right); return left; },
                               CH_UNORDERED_ID);
}

Le contrat garanties a Set, et l’implémentation décide d’un HashSet; semble raisonnable. Cependant, mon implémentation a besoin de la recherche de temps constant garantie par un HashSet, pas n'importe quel ancien Set. Si l'implémentation de toSet() décide d'utiliser, par exemple, un FooSet, ce qui relève parfaitement de ses droits, mon implémentation est compromise.

Quelle est la meilleure solution pratique à ce problème?

60
Robert Bain

Si vous voulez un HashSet garanti, utilisez Collectors.toCollection(HashSet::new) .

98
Tagir Valeev