Ciao, questo è quello da fare e bentornato.
Diamo un'occhiata alle operazioni di raccolta che sono rappresentate dai metodi Collect.
E questi sono metodi sovraccarichi.
E come suggerisce il nome, i metodi Collect vengono utilizzati per raccogliere un flusso di elementi in un contenitore Container che può
essere qualcosa come un nido o un set o una mappa o uno qualsiasi degli oggetti Giller.
Non deve essere una struttura dati come una lista o un set.
Può essere qualsiasi oggetto normale e quindi deve essere il contenitore e i metodi attuali sono molto importanti
e anche molto interessanti.
Sono davvero importanti perché è molto calmo e raccolgono flussi di elementi in qualcosa come una
lista e sono anche molto interessanti perché possiamo anche raggruppare gli elementi del flusso e fare qualcosa come una
mappa.
OK.
Quindi possiamo raggruppare possiamo anche fare un gruppo complesso come all'interno di una mappa.
I Vladi non hanno bisogno di essere un valore singolo.
Può anche essere un'altra struttura di dati come una lista.
Quindi possiamo fare cose interessanti e possiamo fare tutto questo in un modo molto elegante perché stiamo usando
uno stile di programmazione dichiarativo.
Quindi sarà molto interessante ed è una lezione molto importante su questo concetto chiamato up e il
reindirizzamento è anche associato al metodo Collect.
Ed è anche molto importante.
Quindi andiamo avanti e vediamo quali sono le operazioni di raccolta.
E abbiamo una serie di lezioni dedicate solo al metodo Collect.
Quindi andremo ad esplorare l'argomento Collect in una teoria molto dettagliata perché è un metodo molto
importante.
E dalla lezione precedente sappiamo che le operazioni di riduzione possono essere di due tipi su uno di
essi è rappresentato se lo sviluppo che è sull'altro.
Ma i metodi Collect quindi le operazioni di raccolta sono anche archetipiche per le operazioni di riduzione.
Ma le riduzioni che il chilometro fa è indicato come riduzione mutabile.
Su quello che il metodo di lettura fa come riduzione immutabile.
Quindi quello che abbiamo visto in precedenza con le operazioni di riduzione con il metodo di utilizzo della lettura è stato immutabilmente ridotto.
Quindi, in base alla progettazione, il metodo di utilizzo eseguirà una riduzione immutabile, mentre l'impegno progettuale è ciò che fa
qualcosa che si chiama riduzione muter.
E questa distinzione tra ridotto come è molto importante e se le fonti non spiegano questa distinzione in modo chiaro
ea causa di ciò Dobler può essere confuso circa il metodo ridotto e potrebbero abusare di questo o
di quello che usando una riduzione mutabile.
Quindi potrebbero usarlo e usare la riduzione mutabile.
Infatti, nell'ultima lezione, quando avevamo a che fare con la terza versione, usava un
metodo che aveva i tre parametri come l'identità del combinatore sotto accumulatore.
Abbiamo abusato del metodo di utilizzo della lettura che abbiamo usato una riduzione mutabile.
E non è giusto.
E se lo facciamo, possiamo finire con Inkatha preservato in risultati inefficienti.
Quindi esamineremo questa distinzione tra i metodi ridotti e i metodi Collect.
E quindi è una lezione molto importante e sappiamo che ci sono degli accorgimenti che riducono il flusso in un singolo
valore e che possono essere usati per fare cose come sommare gli elementi del flusso. Trovare un Macsyma è il
minimo sul cliente che è abituato a Riduci il flusso in un singolo contenitore e il contenitore può essere una raccolta come
un elenco o un set o una mappa oppure può anche essere un oggetto come generatore di stringhe
o può anche essere qualcosa chiamato oggetto di riepilogo e un oggetto di riepilogo essenzialmente riepiloga
lo stream due diversi valori Samadi.
Quindi è un oggetto contenitore.
Ora, ad esempio, se lo stream è un flusso di numeri, allora a qualcuno può avere un elenco
di qualcuno che valori come una somma o una media o un minimo assoluto su tutto ciò sarebbe isolato.
E questo oggetto di Samara di Cortez.
E come abbiamo accennato prima la riduzione, ma il metodo Collect è l'introduzione e questa è la
slide della lezione precedente, è così che funziona quel metodo.
Quindi stai usando un flusso di elementi in un singolo valore che è 15.
Quindi l'operazione più è applicata qui.
Così fa quell'operazione di adduzione.
E questa è la funzione di accumulatore e che viene segnalata per essere applicata all'analisi degli
elementi del flusso una riduzione immutabile.
E finalmente otteniamo il valore di essere su questo è come funziona il metodo Collect.
Quindi il metodo clock riduce lo stream a cena in modo che abbiamo gli elementi del flusso 5 5:
01 sotto il fondo abbiamo il contenitore che ha gli elementi 5:01.
Quindi iniziamo con il contenitore che possiamo vedere in alto e non è altro che la funzione acuminata, proprio
come nel caso in cui USMA, come la funzione motoria umana, viene applicata ripetutamente
in diversi passaggi.
Quindi nel primo passo prende un contenitore vuoto sulla fust e poi cinque e poi muta il
contenitore vuoto e fa quel giorno con il valore e poi la seconda iterazione che è il secondo
passo del processo di accumulazione il contenitore con il valore 5 sarà combinato con il valore di su cui
è un elemento estremo sul contenitore come ancora una volta nucleato per ottenere il valore.
E un tipo ha il valore di una corsa sullo stesso contenitore che sarà usato ancora una volta nel
terzo passaggio e sarà accumulato con il valore 3.
Quindi la cena finale avrà i valori Phi 1 e 3.
Quindi lo stesso può non essere viene utilizzato qui e viene ripetutamente nucleato con ogni
fase dell'accumulo.
Ecco cosa sta succedendo qui.
Quindi abbiamo bisogno di un fornitore qui perché devi creare questo contenitore.
Quindi l'inizio del processo di cumulo deve creare il contenitore che utilizziamo un fornitore
e il fornitore che conosciamo è un'interfaccia di funzione che può essere utilizzata per creare nuovi oggetti.
Destra.
E l'accumulatore è un'altra funzione che fa il processo di accumulazione.
Infine, se abbiamo a che fare con un flusso parallelo, abbiamo anche bisogno di un combinatore perché possiamo considerare che l'intero
processo influisce sulla tua immolazione come se fosse un segmento quando abbiamo a che fare con un flusso
parallelo perché il flusso parallelo sta per suddividere gli elementi in diversi segmenti.
Quindi in questo caso abbiamo un contenitore un valore accumulato che è un contenitore.
In questo caso ha valori 5 1 e 3.
Avremo anche altri segmenti e segmenti di dusks, in che modo contenitori simili dovremmo
combinarli.
E per questo abbiamo bisogno della funzione combinata.
Va bene così la funzione combinatore combina i contenitori accumulati da ciascuno dei segmenti in modo
che ciascuno dei segmenti abbia i propri contenitori.
Passiamo al mio editor per esaminare il processo di produzione mutevole e il metodo click OK.
Qui ci si trova nella classe delle operazioni di streaming nell'ordine del metodo delle detrazioni che abbiamo visto in precedenza.
E questo significa che abbiamo avuto il boom in chiesa.
Sono due versioni di quello sono doucement Questa è la seconda versione della terza versione.
Ed ecco la seconda versione qui è una terza opzione.
Prima hai detto che la terza opzione e il terzo desiderio e abbiamo usato una riduzione multipla e
non avremmo dovuto farlo.
Quindi ti concentrerai su quella materia.
E quindi queste sono tutte le cose che faremo.
E questo particolare Demel.
Quindi voglio iniziare con la ricreazione sull'ordine per ridurre i metodi.
Quindi voglio solo portare un po 'più di chiarezza su ciò per adorarci quando dobbiamo usarne uno.
Quindi lo esamineremo e mi concentrerò anche su quello che è meno importante sul metodo di utilizzo
tradizionale e guarderemo anche a qualcosa chiamato il principio dello streaming design.
Finalmente lo sto osservando o solo con l'azione di mutabilità sui problemi che abbiamo con quello.
Quindi stiamo andando a guardare quello e da lì andremo a vedere il Collect incontrato che va bene.
Quindi queste sono alcune delle cose che vedremo.
Quindi sarà una dimostrazione approfondita.
Quindi qui abbiamo avuto i voti e stavamo producendo questi grandi qui.
Stavamo semplicemente concatenando.
Quindi questa è la seconda versione di quel metodo di utilizzo dell'Id.
Ecco qui.
Quindi seleziona un'identità e richiede un operatore binario e questo dà all'operatore binario
la semplice esecuzione della concatenazione.
Quindi qui come sorgente del flusso siamo solo la sorgente del flusso è una matrice.
Quindi gli operatori stupidi grandi e stupidi hanno lo stesso tipo e producono un output dello stesso tipo.
Quindi qui stiamo concatenando due stringhe e l'output è anche una stringa infinita, non con
tre dei che usano Todd o metodo.
Quindi ci vuole un'identità e un accumulatore come nel caso della seconda domanda.
Ma ci vuole anche un combinatore, nemmeno una differenza tra la seconda e la terza domanda
è che l'accumulatore qui è una funzione di byte.
Quindi, in precedenza, nella seconda domanda a proposito, si diceva che è un byte, è un operatore binario.
Ma qui è una per funzione che prende stupidi amatori di tipi diversi e produce avanti e indietro
mentre lo invio con operatore binario.
È lo stesso tipo di Tupa ma degli stessi tipi.
Quindi qui nella terza versione sta attaccando un generatore di stringhe e una stringa e sta generando un generatore di
stringhe.
OK.
Quindi sta prendendo due elementi da due diversi tipi.
Questa è la differenza principale.
Quindi se stai affrontando uno scenario in cui i parametri con due diversi tipi dovresti andare a
prendere questa versione ridotta.
OK, ma se il primer non ha lo stesso tipo, puoi usare la seconda versione qui su entrambi un
libro con i blood stream.
Ma in questo caso, quando trattiamo la parte dei flussi, dovremmo
utilizzare una funzione combinatore perché nel flusso parlance avremo segmenti diversi su ciascuno di
questi segmenti.
Produrremo un costruttore di stringhe singolo in questo caso non è possibile utilizzare qui le combinazioni combinate
sul cumulativo perché i tubi sono diversi con questo accumulatore.
Ma nel caso di una bottiglia di flusso ciascuno dei segmenti produrrà un valore accumulato di quel generatore di stringhe di
quel tipo.
Quindi dobbiamo combinare i due valori accumulati che sono dello stesso tipo.
Quindi dobbiamo usare questo combinatore.
Tutto ok.
Quindi questa è la cosa principale.
Quindi la differenza principale tra le due funzioni è la funzione accumulatore e una di
esse ha lo stesso tipo e nell'altra abbiamo tipi diversi se si deve usare un accumulatore che ha bisogno
di due tipi diversi.
Allora devi andare con questo.
Ora la seconda cosa è che se ci pensi, in realtà non abbiamo bisogno di questo combinatore.
Se abbiamo a che fare con questo flusso sequenziale piuttosto che su una nota post-it, la sequenza di flusso
che succede è che abbiamo un singolo segmento proprio dove stiamo creando il generatore di stringhe.
E poi finiamo per terminare la stringa e questo è fatto in modo particolarmente vero fino a quando
non elaboriamo tutti gli elementi del flusso sul davanti e il proiettile è scritto.
Quindi non abbiamo bisogno di questa particolare funzione combinatore che combina due diversi costruttori di corde.
Quindi non ne abbiamo bisogno.
Quindi potresti chiederti perché non come fanno le versioni diverse del metodo d'uso auto-diretto 1 per il flusso
sequenziale e l'altro per sconfinare.
È una domanda normale e possiamo rispondere a questa domanda.
Ma la cosa è che i progettisti linguistici volevano che l'API del flusso fosse agnostica al tipo di
flusso sottostante.
Quindi volevano che l'AP non distingua tra strisce sequenziali e Pablos.
Questo è il principio di progettazione che l'API di streaming offre e questo è quello che volevano e il vantaggio è che
facciamo un esempio, diciamo che stiamo facendo in modo che questo flusso non sia gestito.
Quindi stiamo solo avendo una variabile che prende questo flusso e vediamo se abbiamo un altro metodo
che effettivamente fa la riduzione.
OK.
E questo significa che lo faremo userei il velox non documentato del flusso.
Quindi all'interno di questa materia supponiamo di avere quell'altra specie che è il metodo di Dool
che ha solo due parametri su di essa.
Ora più avanti, a un certo punto, se lo sviluppatore cambia lo stream in uno stream parallelo perché è
molto semplice cambiare lo stream in uno stream parallelo.
E una volta fatto ciò, non funzionerà se il raggio di equilibrio verrà passato a quel metodo che usa che usa
un metodo che funziona con flusso sequenziale solo di quanto non riuscirà.
Quindi i progettisti di linguaggi volevano evitare che facendo in modo che l'API non lo fosse, non distinguono
tra flussi sequenziali e paralleli.
Quindi se lo si cambia in un flusso se si modifica il flusso di bilanciamento, il resto della pipeline
dovrebbe o non dovrebbe cambiare.
Tutto dovrebbe essere perfettamente.
Quindi questa è la cosa.
Ma un'altra cosa è anche se la funzione combinatore non viene utilizzata qui per un flusso sequenziale, ma in
una versione futura il combinatore potrebbe anche essere utilizzato anche per un flusso sequenziale.
Quindi, poiché si tratta di un dettaglio di implementazione sul linguaggio, i progettisti potrebbero decidere che ciò sia
un vantaggio che può anche utilizzare la funzione combinatore per migliorare le prestazioni.
Ma questo è un dettaglio di implementazione e le implementazioni possono cambiare con qualsiasi peggio di tutto il JDK.
Quindi non lo sappiamo mai.
Sai che un'altra cosa è qui che questo combinatore non può non essere.
OK, testiamo che anche per un Sindhi sequenziale è un flusso sequenziale.
Ora se lo esegui come possiamo vedere, ottieni un'eccezione senza partner, quindi non può esserlo.
Quindi tienilo a mente.
Ora testiamo anche il principio di progettazione stesso.
Quindi cambiamo questo e lasciamo cadere il flusso sanguigno.
Quindi questo è un modello dall'interfaccia di streaming.
In testa è dal Bob, muoviamoci dallo stream stream del flusso.
Quindi viene da lì.
Quindi, cambiamo solo questo come possiamo vedere l'output è ancora aeb.
Quindi questo è uno.
E questo è un concat
Quindi facciamo la stessa cosa
Ma anche la terza opzione che userò Metford ora puoi vedere
che lui o ne ha inventati due ha un output diverso, quindi non ha lo stesso output.
Potrei aggiungere ancora una volta alla saga e puoi vedere un altro Non indossare Non stiamo ottenendo a
e b.
Quindi non appena lo abbiamo cambiato in parlamento.
Quindi l'uscita è esplosa.
Quindi non stiamo ottenendo lo stesso risultato.
Quindi tuffo che voglio suggerire è che so dove stai lavorando con i flussi.
Verifica sempre i tuoi risultati con il flusso Parlow.
Quindi, per testare la correttezza, dovresti anche renderla BOTELER a quel dottore hai lo
stesso risultato.
Altrimenti potresti finire con un risultato errato come quello che stiamo vedendo qui.
Quindi prova sempre a testare lo stream di Arlan EP.
Potrebbe benissimo darti la scheda presentata con un flusso sequenziale, ma potrebbe andare male e sviluppare
il nostro live streaming.
OK.
In futuro potresti effettivamente convertirlo in un flusso parallelo.
Quindi assicurati che funzioni anche con il flusso di Barlas.
Quindi questo è il principio di progettazione è chiaro qui, ma in questo caso la ragione per cui abbiamo questo
è perché usa il metodo qui è l'uso sta facendo più produzione.
Quindi qui ciò che sta accadendo è che questo è un contenitore, ma è un contenitore.
E qui stiamo facendo Pattillo, il che significa che abbiamo più segmenti sebbene il metodo stia andando
a partizionare gli elementi in due gruppi e in tutti e tre i gruppi.
Quindi utilizzerà un corso diverso e tutti questi punteggi verranno condivisi con lo stesso contenitore.
OK, lo stesso contenitore verrà utilizzato per tutti.
E quindi ci deve essere un coordinamento tra i thread qui dove non
c'è che direi se ci sarà una condizione di gara e per questo possiamo vedere nei personaggi.
OK, questa è una delle cose principali.
E un'altra cosa è che una volta che l'accumulo è stato fatto, la funzione combinatore deve combinare le cene e
in questo caso abbiamo un singolo contenitore e combineremo lo stesso contenitore.
Quindi combineremo lo stesso contenitore con se stesso.
Quindi a causa di questo abbiamo anche come questo problema e ottenuto un risultato.
Quindi è solo un due casi in quanto la stringa che non è sicura sul secondo problema è anche
la funzione combinatore.
Quindi questa è la cosa.
Quindi stiamo cambiando lo stesso contenitore con il suo salvataggio diretto.
Quindi questo è il problema principale e non dovremmo usare o usare un metodo per questo, ma
c'è solo quattro o si rinuncia alla produzione immutabile.
Quindi, se si guarda al metodo di utilizzo della lettura che dice che utilizza una funzione di byte.
Ma dopo esamineremo il metodo Collect.
Usa un consumatore di byte.
E quando diciamo che il consumatore non colpisce nulla nelle ricerche progettate in modo naturale per il
muting sul container.
Andiamo avanti e guardiamo anche a questo.
Copi solo questa cosa intera.
Qui abbiamo questo metodo chiamato come riduzione mutabile.
Quindi qui aggiungerò un mostro alla questione del colore.
Quindi è solo la stessa cosa.
Quindi permettimi di cambiare questo per raccogliere Narberth. Abbiamo detto che avevamo bisogno di un fornitore all'inizio della
lezione.
Ha detto che abbiamo bisogno di un fornitore qui perché tutto ciò che è stato speso per i ritorni.
Quindi Hala dice che abbiamo bisogno di un fornitore e abbiamo bisogno di un accumulatore.
E abbiamo anche bisogno di un combinatore.
Ma è un fornitore.
Quindi è un'interfaccia di funzione.
Quindi non possiamo semplicemente creare un oggetto, ma dobbiamo passare un metodo di riferimento o un lambda.
Quindi, poiché è uno strato morbido, la fornitura di pasta ha un metodo chiamato Ottieni tutto ciò che il fornitore
fa è creare una nuova istanza di stringa bulgur.
OK.
E quindi questo è anche il flusso di Paglia.
Quindi qui all'interno di ogni segmento verrà creato un contenitore.
Quindi ogni segmento avrà il suo contenitore e il resto delle cose è lo stesso.
Quindi permettimi di copiare semplicemente la dichiarazione di
stampa sul tuo intendo dire uso su requanters. Quindi stai invocando l'opzione di mutabilità dal metodo principale torna
qui su questo in modo che tu possa vederlo piegare a e b.
Ok, questo sta sbagliando.
Quindi permettimi di cambiare anche questo in un normale flusso sequenziale.
Siamo solo noi ma qui.
Quindi, ancora una volta è solo la stessa uscita.
Quindi stiamo ottenendo lo stesso risultato sia che si tratti di un flusso sequenziale a nostro modo che non si tratta di
un'altra stringa.
Ok allora.
Quindi abbiamo bisogno di usare il metodo orologio e orologio come vediamo qui.
Ha anche un accumulatore, ha anche un combinatore ma ci riprende più tardi.
Ma ancora più importante l'accumulatore qui è un consumatore di byte con quello che userei era una funzione byte
per funzione o valore Denso che avevamo come consumatore di biciclette non restituisce nulla.
Ha solo il metodo accettate che non fa nulla a Arterton.
Quindi uno dei parametri deve essere un contenitore che viene accumulato.
Che ovviamente sta per essere mutato.
Quindi questa è la cosa.
Ora c'è anche una versione qui possiamo fare questo M. W. libro riduzione con l'uso.
Facendo questo.
Quindi qui quello che stiamo facendo è quasi la stessa cosa.
È appena ormeggiato qui e inizia a dire semplicemente come Bedacht.
Quindi, invece di lavorare su questo particolare parametro che è il contenitore, stiamo creando un nuovo
contenitore.
OK.
Ecco qui.
E quindi stiamo aggiungendo il generatore di stringhe a questo perché sugli uomini che usano metodi che sono sovraccarichi di metodi uno
di loro può prendere un generatore di stringhe e può prendere una stringa.
Quindi in questo caso stiamo usando entrambi i metodi di ordine di Autard.
Per aggiungere un generatore di stringhe qui sotto per aggiungere la stringa stessa.
Quindi il problema con questo in modo che questo genererà sotto contatto o mettere un limite su di esso qui.
Questo ha anche BOTELER, qui ha ancora sta producendo un B.
Eccolo concat 3.
Si chiama inventare, stiamo stampando Cancri qui.
Ma il problema con questo è che abbiamo diversi passaggi di accumulazione su ciascuno di essi sta creando un
nuovo generatore di stringhe.
OK.
Quindi questa è una cosa inefficiente.
Quindi non stiamo mutando lo stesso generatore di stringhe, ma stiamo creando una nuova stringa dove ad ogni passo.
Quindi questa è la differenza.
Ma il metodo click.
Quindi questo metodo dà anche il corretto a.
È ancora inefficiente
OK.
Ecco, questo è tutto.
Quindi questa è la prima versione della chiamata mormorata e ha tutto questo.
C'è anche una versione semplificata perché il metodo di clock caricato sarà discusso nella
prossima lezione, ma usiamolo qui.
Quindi, invece di avere tutte queste tre funzioni dei barometri, possiamo solo dire che i collezionisti di collettori sono una classe
nel flusso di punti dot di Djala, è una classe di supporto e fornisce alcuni tipi predefiniti di collezionisti senza carta e
quei collezionisti possono aiutarci a realizzare questo tipo di funzionalità quindi c'è un collezionista per aver fatto
questo tipo di lavoro e ci ha chiamati a unirci a Gorder, da quando mi sono unito ai collezionisti e intendo un quarterback
che in realtà
sono le stringhe di Densa a modernizzarsi, quindi progettare
fa praticamente quello che stiamo facendo qui e ci sono anche collezionisti per altri scopi.
E come per esempio se vuoi generare lo streaming in una lista, allora abbiamo qualcosa per questo.
E se vuoi raggruppare gli elementi del flusso come un altro metodo per quello e altri metodi di
produzione statici per quel gruppo chiamato da.
E possiamo usare quello.
Quindi lasciami correre ora, eccolo qui.
Quindi, ancora una volta sei catturato con il ricongiungimento, ci sta dando lo stesso anche se è
circa 12 corde.
Quindi questa è la cosa.
Quindi questi sono lì per raccogliere metodi e spiegheremo di più su questi collezionisti e sulla prossima lezione.
Ma ora abbiamo un'idea su come usarlo.
Quindi questo è tutto.
Grazie.
Spero vi sia piaciuto conoscere il metodo del collezionista e la produzione mutevole.
E questo è tutto.
Grazie.
E felice codifica.