Dal momento che utilizzo molto gli stream, alcuni dei quali trattano una grande quantità di dati, ho pensato che sarebbe una buona idea pre-allocare i miei raccoglitori basati su collezioni con una dimensione approssimativa per evitare costose riallocazioni man mano che la raccolta cresce . Così mi è venuta con questo, e altri simili per altri tipi di raccolta:È importante utilizzare Characteristics.UNORDERED in Collectors quando possibile?
public static <T> Collector<T, ?, Set<T>> toSetSized(int initialCapacity) {
return Collectors.toCollection(()-> new HashSet<>(initialCapacity));
}
usa così
Set<Foo> fooSet = myFooStream.collect(toSetSized(100000));
La mia preoccupazione è che l'attuazione di Collectors.toSet()
imposta un enum Characteristics
che Collectors.toCollection()
non lo fa: Characteristics.UNORDERED
. Non esiste alcuna variazione conveniente di Collectors.toCollection()
per impostare le caratteristiche desiderate oltre il valore predefinito e non è possibile copiare l'implementazione di Collectors.toSet()
a causa di problemi di visibilità. Quindi, per impostare la caratteristica UNORDERED
sono costretto a fare qualcosa di simile:
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});
}
Così qui sono le mie domande: 1. È questa la mia unica opzione per la creazione di un collezionista non ordinata per qualcosa di semplice come un costume toSet()
2. Se voglio che funzioni in modo ideale, è necessario applicare la caratteristica non ordinata? Ho letto a question on this forum dove ho appreso che la caratteristica non ordinata non è più propagata indietro nel flusso. Ha ancora uno scopo?
Ma un 'HashSet' non è ordinato (e quindi è la definizione di un set). Quindi lo snippet di codice dovrebbe essere ancora in ordine arbitrario. O mi sto perdendo qualcosa qui? – Obicere
Questa è una buona domanda, @Obicere. Apparentemente il fatto che si tratti di una collezione non ordinata non è noto all'api, quindi l'enume 'Characteristics' è usato nei collezionisti per fornire suggerimenti aggiuntivi sull'api. Vedi il codice sorgente per 'Collectors.toSet()'. Utilizza anche un 'HashSet' e imposta deliberatamente la caratteristica' UNORDERED' come suggerimento per 'Stream' o upstream' Collector' chiamandola. –
ahh gotcha. Solo guardando gli usi, sembra necessario [in alcuni punti] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/stream /ReduceOps.java#185). Quindi sembra che la risposta al numero 2 dipenda davvero se si desidera che siano disponibili piccole opzioni di ottimizzazione. – Obicere