Collectors.toSet () und HashSet

74

Nehmen Sie die folgende Zeile des Beispielcodes:

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

Ich will eine HashSet. Wenn ich einen Debugger zum Code bringe, bekomme ich tatsächlich einen HashSet. Ich habe mir java.util.stream.Collectors.toSet()den folgenden Code angesehen:

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);
}

Der Vertrag garantiert a Set, und die Umsetzung entscheidet über a HashSet; scheint vernünftig. Meine Implementierung benötigt jedoch die konstante Zeitsuche, die von a garantiert wird HashSet, nicht von irgendeiner alten Set. Wenn die Implementierung von toSet()say a verwendet FooSet, was vollkommen in ihren Rechten liegt, ist meine Implementierung gefährdet.

Was ist die Best-Practice-Lösung für dieses Problem?

Robert Bain
quelle

Antworten: