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?
Si vous voulez un HashSet
garanti, utilisez Collectors.toCollection(HashSet::new)
.