Ist es wichtig, Characteristics.UNORDERED in Collectors zu verwenden, wenn dies möglich ist?
Da ich häufig Streams verwende, von denen einige eine große Datenmenge verarbeiten, hielt ich es für eine gute Idee, meinen auf Sammlungen basierenden Kollektoren eine ungefähre Größe zuzuweisen, um eine kostspielige Neuzuweisung zu verhindern, wenn die Sammlung wächst. Also habe ich mir das und ähnliche für andere Sammlungstypen ausgedacht:
public static <T> Collector<T, ?, Set<T>> toSetSized(int initialCapacity) {
return Collectors.toCollection(()-> new HashSet<>(initialCapacity));
}
Gebraucht wie folgt
Set<Foo> fooSet = myFooStream.collect(toSetSized(100000));
Meine Sorge ist, dass die Implementierung vonCollectors.toSet()
setzt einCharacteristics
enum thatCollectors.toCollection()
nicht:Characteristics.UNORDERED
. Es gibt keine bequeme Variante vonCollectors.toCollection()
, um die gewünschten Eigenschaften über den Standardwert hinaus festzulegen. Die Implementierung von @ kann nicht kopiert werdeCollectors.toSet()
wegen Sichtbarkeitsproblemen. Also, um das @ zu setzUNORDERED
Merkmal Ich bin gezwungen, so etwas zu tun:
static<T> Collector<T,?,Set<T>> toSetSized(int initialCapacity){
return Collector.of(
() -> new HashSet<>(initialCapacity),
Set::add,
(c1, c2) -> {
c1.addAll(c2);
return c1;
},
new Collector.Characteristics[]{IDENTITY_FINISH, UNORDERED});
}
So sind hier meine Fragen: 1. Ist dies meine einzige Option zum Erstellen eines ungeordneten Sammlers für etwas so Einfaches wie ein benutzerdefiniertestoSet()
2. Wenn dies ideal funktionieren soll, muss die ungeordnete Eigenschaft angewendet werden? Ich habe gelesen eine Frage in diesem Forum wo ich erfahren habe, dass das ungeordnete Merkmal nicht mehr in den Stream zurückübertragen wird. Hat es noch einen Zweck?