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?
java
java-8
java-stream
collectors
Robert Bain
quelle
quelle