I flussi Java 8 consentono agli sviluppatori di estrarre dati precisi da un'ampia raccolta, utilizzando una serie di operazioni predefinite.

Prima del rilascio di Java 8, l'utilizzo del termine "flusso" in Java veniva automaticamente associato all'I / O. Tuttavia, Java 8 ha introdotto un flusso che può essere definito come un insieme di passaggi computazionali concatenati insieme in quella che viene comunemente definita "pipeline di flusso".

Questo articolo ti introdurrà ai flussi Java 8 e dimostrerà come possono essere utili nei tuoi progetti.

Cos'è uno stream?

Uno stream è un'interfaccia Java che prende un'origine, esegue una serie di operazioni per estrarre dati specifici, quindi fornisce tali dati all'applicazione per l'uso. In sostanza, ti consente di estrarre dati specializzati da una raccolta di dati generalizzati.

Come funzionano gli stream

Una pipeline di flusso inizia sempre con un'origine. Il tipo di origine dipende dal tipo di dati con cui hai a che fare, ma due dei più popolari sono gli array e le raccolte.

instagram viewer

Per trasformare la raccolta in un flusso iniziale, dovrai aggiungere il file stream () funzione alla sorgente. Ciò posizionerà la sorgente nella pipeline del flusso in cui diverse operazioni intermedie (come filtro() e ordinare()) può operare su di esso.

Dopo che tutte le operazioni intermedie richieste sono state eseguite, è possibile introdurre un'operazione da terminale (come per ciascuno()), che produrrà i dati precedentemente estratti dalla sorgente.

Vita senza ruscelli

Java 8 è stato rilasciato nel 2014, ma prima di allora, gli sviluppatori Java dovevano ancora estrarre dati specializzati da una raccolta di dati generali.

Supponiamo che tu abbia un elenco di caratteri casuali che vengono combinati con numeri casuali per formare valori di stringa univoci, ma vuoi solo i valori che iniziano con il carattere “C” e vuoi disporre il risultato in ordine crescente ordine. Ecco come estrarre i dati senza flussi.

Relazionato: Cosa devi sapere sull'uso delle stringhe in Java

Esempio di filtro e ordinamento dei valori senza flussi


importare java.util. Lista di array;
importare java.util. Array;
importare java.util. Elenco;
public class Main {
public static void main (String [] args) {
// dichiara e inizializza l'elenco di array
Elenco randomValues ​​= Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "C13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "C16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// dichiara che l'elenco degli array memorizzerà i valori necessari
Elenco requiredValues ​​= new ArrayList <> ();
// estraendo i valori richiesti e memorizzandoli in reqquiredValues
randomValues.forEach (value -> {
if (value.startsWith ("C")) {
requiredValues.add (valore);
}
});
// ordina i valori obbligatori in ordine crescente
requiredValues.sort ((String value1, String value2) -> value1.compareTo (value2));
// stampa ogni valore sulla console
requiredValues.forEach ((String value) -> System.out.println (value));
}
}

Dovrai anche dichiarare e inizializzare l'elenco di array se stai utilizzando stream o qualche altro metodo di estrazione. Quello che non avresti bisogno di fare se stessi usando gli stream è dichiarare una nuova variabile per contenere i valori richiesti, né creare le altre cinque più righe di codice nell'esempio sopra.

Relazionato: Come creare ed eseguire operazioni su array in Java

Il codice precedente produce il seguente output nella console:


C11
C12
C13
C14
C15
C16

La vita con i flussi

Nella programmazione, l'efficienza parla di produrre lo stesso risultato con un codice significativamente inferiore. Questo è esattamente ciò che fa una pipeline di flusso per un programmatore. Quindi la prossima volta che qualcuno chiede: "perché è importante utilizzare gli stream nel tuo progetto?" In poche parole: "i flussi supportano una programmazione efficiente".

Continuando con il nostro esempio sopra, è così che l'introduzione di flussi trasforma l'intero programma.

Filtraggio e ordinamento di valori con un esempio di flusso


importare java.util. Array;
importare java.util. Elenco;
public class Main {
public static void main (String [] args) {
// dichiara e inizializza l'elenco di array
Elenco randomValues ​​= Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "C13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "C16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// recupera solo i valori che iniziano con C, li ordina e li stampa nella console.
randomValues.stream (). filter (value-> value.startsWith ("C")). Sort (). forEach (System.out:: println);
}
}

Il codice sopra mostra quanto sia potente l'interfaccia del flusso. Prende un elenco di valori di array casuali e lo trasforma in un flusso utilizzando l'estensione stream () funzione. Il flusso viene quindi ridotto a un elenco di array che contiene i valori richiesti (ovvero tutti i valori che iniziano con C), usando il filtro() funzione.

Come puoi vedere nell'esempio sopra, il file C i valori sono disposti in modo casuale nell'elenco degli array. Se dovessi stampare il flusso a questo punto della pipeline, il valore C15 verrà stampato per primo. quindi, il ordinare() la funzione viene introdotta nella pipeline del flusso per riorganizzare il nuovo array in ordine crescente.

La funzione finale nella pipeline del flusso è un file per ciascuno() funzione. Questa è una funzione terminale utilizzata per arrestare la pipeline di flusso e produce i seguenti risultati nella console:


C11
C12
C13
C14
C15
C16

È disponibile un ampio elenco di operazioni intermedie che possono essere utilizzate in una pipeline di flusso.

Una pipeline di flusso inizia sempre con una singola origine e un file stream () e termina sempre con una singola operazione da terminale (sebbene ce ne siano molte diverse per scegliere da.) Ma tra queste due sezioni c'è un elenco di sei operazioni intermedie che puoi eseguire uso.

Nel nostro esempio sopra, vengono utilizzate solo due di queste operazioni intermediefiltro() e ordinare(). L'operazione intermedia che scegli dipenderà dalle attività che desideri eseguire.

Se uno qualsiasi dei valori che iniziano con "C" nel nostro elenco di array di cui sopra fosse in minuscolo e abbiamo eseguito le stesse operazioni intermedie su di essi, otterremmo il seguente risultato.

Esempio di esecuzione di operazioni di filtro e ordinamento su valori minuscoli


importare java.util. Array;
importare java.util. Elenco;
public class Main {
public static void main (String [] args) {
// dichiara e inizializza l'elenco di array
Elenco randomValues ​​= Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "c13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "c16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// recupera solo i valori che iniziano con C, li ordina e li stampa nella console.
randomValues.stream (). filter (value-> value.startsWith ("C")). Sort (). forEach (System.out:: println);
}
}

Il codice precedente produrrà i seguenti valori nella console:


C11
C12
C14
C15

L'unico problema con l'output sopra è che non rappresenta accuratamente tutti i file valori nel nostro elenco di array. Un buon modo per correggere questo piccolo errore è introdurre un'altra operazione intermedia nella pipeline del flusso; questa operazione è nota come carta geografica() funzione.

Utilizzo dell'esempio della funzione mappa


importare java.util. Array;
importare java.util. Elenco;
public class Main {
public static void main (String [] args) {
// dichiara e inizializza l'elenco di array
Elenco randomValues ​​= Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "c13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "c16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// trasforma tutti i caratteri minuscoli in maiuscoli,
// recupera solo i valori che iniziano con C, li ordina e li stampa nella console.
randomValues.stream (). map (String:: toUpperCase) .filter (value-> value.startsWith ("C")). Sort (). forEach (System.out:: println);
}
}

Il carta geografica() la funzione trasforma un oggetto da uno stato all'altro; nel nostro esempio sopra, trasforma tutti i caratteri minuscoli nell'elenco degli array in caratteri maiuscoli.

Posizionando il file carta geografica() funzione appena prima del filtro() la funzione recupera tutti i valori che iniziano con C dall'elenco degli array.

Il codice precedente produce il seguente risultato nella console, rappresentando correttamente tutti i file valori nell'elenco degli array.


C11
C12
C13
C14
C15
C16

Le altre tre operazioni intermedie che puoi utilizzare nelle tue applicazioni includono:

  • sbirciare()
  • limite()
  • Salta()

I flussi Java 8 facilitano la creazione di codice efficiente

Con i flussi Java 8 puoi estrarre dati più specifici e rilevanti da una grande sorgente con una riga di codice. Finché includi l'iniziale stream () funzione e un operatore terminale, è possibile utilizzare qualsiasi combinazione di operazioni intermedie che forniscano output adatti al proprio obiettivo.

Se ti stai chiedendo quale sia la riga di codice racchiusa nel nostro filtro() funzione; è nota come "espressione lambda". Le espressioni lambda sono un'altra funzionalità introdotta con Java 8 e ha molti insiemi che potresti trovare utili.

E-mail
Una rapida introduzione a Java 8 Lambdas

Se sei un programmatore Java e sei interessato a saperne di più sui lambda Java 8, in questo articolo daremo un'occhiata più da vicino alla sintassi e all'utilizzo di lambda.

Leggi Avanti

Argomenti correlati
  • Programmazione
  • Giava
  • Tutorial di codifica
Circa l'autore
Kadeisha Kean (13 articoli pubblicati)

Kadeisha Kean è uno sviluppatore di software full-stack e uno scrittore tecnico / tecnologico. Ha la spiccata capacità di semplificare alcuni dei concetti tecnologici più complessi; producendo materiale che può essere facilmente compreso da qualsiasi principiante della tecnologia. È appassionata di scrittura, sviluppo di software interessanti e viaggi per il mondo (attraverso documentari).

Altro di Kadeisha Kean

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!

Ancora un passo…!

Conferma il tuo indirizzo e-mail nell'e-mail che ti abbiamo appena inviato.

.