Sto cercando di fornire la risposta della tua domanda, come ho letto da qualche parte -
<R,A> R collect(Collector<? super T,A,R> collector)
R - il tipo del risultato A - il tipo di accumulo intermedio del collettore collezionista - il collettore che descrive il riduzione Resi - il risultato della riduzione
Esegue un'operazione di riduzione mutabile sugli elementi di questo flusso utilizzando un servizio di raccolta. Un Collector racchiude le funzioni utilizzate come argomenti da raccogliere (Fornitore, BiConsumer, BiConsumer), consentendo il riutilizzo delle strategie di raccolta e la composizione delle operazioni di raccolta come il raggruppamento a più livelli o il partizionamento. Se il flusso è parallelo e il servizio di raccolta è simultaneo e il flusso non è ordinato o il raccoglitore non è ordinato, verrà eseguita una riduzione simultanea (consultare Collector per i dettagli sulla riduzione simultanea.)
Questo è un terminale operazione.
Quando eseguiti in parallelo, è possibile creare istanze multiple, risultati intermedi, popolati e uniti in modo da mantenere l'isolamento delle strutture di dati mutabili. Pertanto, anche se eseguito in parallelo con strutture dati prive di thread (come ArrayList), non è necessaria alcuna sincronizzazione aggiuntiva per una riduzione parallela.
Di seguito si accumulano stringhe in un ArrayList:
List<String> asList = stringStream.collect(Collectors.toList());
Di seguito sarà classificare oggetti Person per stato e città, a cascata due Collezionisti insieme:
Map<String, Map<String, List<Person>>> peopleByStateAndCity
= personStream.collect(Collectors.groupingBy(Person::getState,
Collectors.groupingBy(Person::getCity)));
Suppongo che tu sappia già che puoi fare la cosa giusta concatenando le chiamate 'map',' filter' e 'collect'. Quindi qual è lo scopo della tua richiesta di farlo in una chiamata al metodo? Perché quel "sente" come essere più efficiente? – Holger
@Holger Lega la pre-condizione alla funzione di mappatura, il che aiuta a rendere chiara una _si_ una pre-condizione all'altra, inoltre rende impossibile rompere il codice cambiando l'ordine delle chiamate al metodo. –
In realtà, è l'opposto. Nessuno può distinguere dalla firma di un singolo metodo che contiene una funzione di mappatura e un predicato che viene applicato per primo. Al contrario, con l'API 'Stream', tutti comprendono la differenza tra' map (...) .filter (...) .collect (...) 'e' .filter (...) .map (...) .collect (...) '. Ed è anche in grado di dedurre il significato di altre combinazioni come 'map (...) .filter (...) .map (...) .collect (...)' ... – Holger