Fluxurile Java 8 permit dezvoltatorilor să extragă date precise dintr-o colecție mare, utilizând un set de operații predefinite.

Înainte de lansarea Java 8, utilizarea termenului „stream” în Java ar fi asociată automat cu I / O. Cu toate acestea, Java 8 a introdus un flux care poate fi denumit un set de pași de calcul înlănțuiți în ceea ce este denumit în mod obișnuit o „conductă de flux”.

Acest articol vă va prezenta fluxurile Java 8 și vă va arăta cum pot fi utile în proiectele dvs.

Ce este un flux?

Un flux este o interfață Java care ia o sursă, efectuează un set de operații pentru a extrage date specifice, apoi furnizează aceste date aplicației pentru utilizare. În esență, vă permite să extrageți date specializate dintr-o colecție de date generalizate.

Cum funcționează fluxurile

O conductă de flux începe întotdeauna cu o sursă. Tipul sursei depinde de tipul de date cu care aveți de-a face, dar două dintre cele mai populare sunt matrici și colecții.

Pentru a transforma colecția într-un flux inițial, va trebui să adăugați

instagram viewer
curent() funcționează la sursă. Aceasta va plasa sursa în conducta fluxului în care există mai multe operații intermediare diferite (cum ar fi filtru() și fel()) poate opera pe el.

După efectuarea tuturor operațiunilor intermediare necesare, puteți introduce o operație terminală (cum ar fi pentru fiecare()), care va produce datele extrase anterior din sursă.

Viața fără fluxuri

Java 8 a fost lansat în 2014, dar înainte de aceasta, dezvoltatorii Java aveau încă nevoie să extragă date specializate dintr-o colecție de date generale.

Să presupunem că aveți o listă de caractere aleatorii care sunt combinate cu numere aleatoare pentru a forma valori de șir unice, dar doriți doar valorile care încep cu caracterul „C” și doriți să aranjați rezultatul în creștere Ordin. Acesta este modul în care ați extrage aceste date fără fluxuri.

Legate de: Ce trebuie să știți despre utilizarea șirurilor în Java

Filtrarea și sortarea valorilor fără flux Exemplu


import java.util. ArrayList;
import java.util. Matrice;
import java.util. Listă;
public class Main {
public static void main (String [] args) {
// declarați și inițializați lista de matrice
Listă 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”
);
// declarați că lista de matrice va stoca valorile necesare
Listă requiredValues ​​= new ArrayList <> ();
// extragerea valorilor necesare și stocarea acestora în Valori cerute
randomValues.forEach (valoare -> {
if (value.startsWith ("C")) {
requiredValues.add (valoare);
}
});
// sortează valorile necesare în ordine crescătoare
requiredValues.sort ((String value1, String value2) -> value1.compareTo (value2));
// imprimați fiecare valoare pe consolă
requiredValues.forEach ((Valoare șir) -> System.out.println (valoare));
}
}

De asemenea, va trebui să declarați și să inițializați lista matricelor, indiferent dacă utilizați fluxuri sau alte metode de extracție. Ceea ce nu ar trebui să faceți dacă utilizați fluxuri este să declarați o nouă variabilă pentru a păstra valorile necesare și nici să creați celelalte cinci linii plus de cod din exemplul de mai sus.

Legate de: Cum să creați și să efectuați operațiuni pe tablouri în Java

Codul de mai sus produce următoarea ieșire în consolă:


C11
C12
C13
C14
C15
C16

Viața cu fluxuri

În programare, eficiența se referă la producerea aceluiași rezultat cu un cod semnificativ mai mic. Exact asta face o conductă de flux pentru un programator. Așadar, data viitoare când cineva întreabă: „de ce este important să folosești fluxuri în proiectul tău?” Simplu spus: „fluxurile acceptă o programare eficientă”.

Continuând cu exemplul nostru de mai sus, acesta este modul în care introducerea fluxurilor transformă întregul program.

Filtrarea și sortarea valorilor cu un exemplu de flux


import java.util. Matrice;
import java.util. Listă;
public class Main {
public static void main (String [] args) {
// declarați și inițializați lista de matrice
Listă 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”
);
// preia numai valorile care încep cu C, le sortează și le imprimă în consolă.
randomValues.stream (). filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

Codul de mai sus demonstrează cât de puternică este interfața fluxului. Acesta ia o listă a valorilor matricei aleatorii și o transformă într-un flux folosind curent() funcţie. Fluxul este apoi redus la o listă de matrice care conține valorile necesare (care sunt toate valorile care încep cu C), folosind filtru() funcţie.

După cum puteți vedea în exemplul de mai sus, C valorile sunt aranjate aleatoriu în lista matrice. Dacă ar fi să tipăriți fluxul în acest moment al conductei, valoarea C15 ar fi tipărit mai întâi. De aceea fel() funcția este introdusă în conducta fluxului pentru a rearanja noua matrice în ordine crescătoare.

Funcția finală în conducta de flux este a pentru fiecare() funcţie. Aceasta este o funcție terminală care este utilizată pentru a opri conducta de flux și produce următoarele rezultate în consolă:


C11
C12
C13
C14
C15
C16

Există o listă extinsă de operațiuni intermediare care pot fi utilizate într-o conductă de flux.

O conductă de flux începe întotdeauna cu o singură sursă și un curent() funcție și se termină întotdeauna cu o singură operație de terminal (deși există mai multe opțiuni diferite pentru alege între.) Dar între aceste două secțiuni este o listă cu șase operații intermediare pe care le puteți utilizare.

În exemplul nostru de mai sus, sunt utilizate doar două dintre aceste operații intermediarefiltru() și fel(). Operația intermediară pe care o alegeți va depinde de sarcinile pe care doriți să le efectuați.

Dacă oricare dintre valorile care încep cu „C” din lista noastră de matrice de mai sus ar fi în minusculă și am efectua aceleași operații intermediare pe ele, am obține următorul rezultat.

Efectuarea de operații de filtrare și sortare pe valori minuscule Exemplu


import java.util. Matrice;
import java.util. Listă;
public class Main {
public static void main (String [] args) {
// declarați și inițializați lista de matrice
Listă 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”
);
// preia numai valorile care încep cu C, le sortează și le imprimă în consolă.
randomValues.stream (). filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

Codul de mai sus va produce următoarele valori în consolă:


C11
C12
C14
C15

Singura problemă cu ieșirea de mai sus este că nu reprezintă cu exactitate toate valorile din lista noastră de matrice. O modalitate bună de a remedia această mică eroare este de a introduce o altă operațiune intermediară în conducta fluxului; această operațiune este cunoscută sub numele de Hartă() funcţie.

Folosind Exemplul Funcției Hărți


import java.util. Matrice;
import java.util. Listă;
public class Main {
public static void main (String [] args) {
// declarați și inițializați lista de matrice
Listă 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”
);
// transformă toate caracterele minuscule în majuscule,
// preia numai valorile care încep cu C, le sortează și le imprimă în consolă.
randomValues.stream (). map (String:: toUpperCase) .filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

Hartă() funcția transformă un obiect dintr-o stare în alta; în exemplul nostru de mai sus transformă toate caracterele minuscule din lista matrice în caractere majuscule.

Plasarea Hartă() funcționează chiar înainte de filtru() funcția recuperează toate valorile care încep cu C din lista matrice.

Codul de mai sus produce următorul rezultat în consolă, reprezentând cu succes toate fișierele valorile din lista matrice.


C11
C12
C13
C14
C15
C16

Celelalte trei operații intermediare pe care le puteți utiliza în aplicațiile dvs. includ:

  • arunca o privire()
  • limită()
  • ocolire()

Fluxurile Java 8 facilitează crearea unui cod eficient

Cu fluxurile Java 8 puteți extrage date suplimentare specifice, relevante dintr-o sursă mare, cu o singură linie de cod. Atâta timp cât includeți inițiala curent() funcție și un operator de terminal, puteți utiliza orice combinație de operații intermediare care oferă ieșiri potrivite pentru obiectivul dvs.

Dacă vă întrebați despre linia de cod inclusă în filtru() funcţie; este cunoscut sub numele de „expresie lambda”. Expresiile Lambda sunt o altă caracteristică introdusă cu Java 8 și are o mulțime de pepite pe care le-ați putea găsi utile.

E-mail
O introducere rapidă la Java 8 Lambdas

Dacă sunteți un programator Java și sunteți interesat să aflați mai multe despre Java 8 lambdas, în acest articol vom analiza mai atent sintaxa și utilizarea lambda.

Citiți în continuare

Subiecte asemănătoare
  • Programare
  • Java
  • Tutoriale de codare
Despre autor
Kadeisha Kean (13 articole publicate)

Kadeisha Kean este un dezvoltator de software complet și scriitor tehnic / tehnologic. Are capacitatea distinctă de a simplifica unele dintre cele mai complexe concepte tehnologice; producând materiale care pot fi înțelese cu ușurință de orice novice în tehnologie. Este pasionată de scriere, dezvoltarea de software-uri interesante și călătoria prin lume (prin documentare).

Mai multe de la Kadeisha Kean

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Încă un pas…!

Vă rugăm să confirmați adresa de e-mail în e-mailul pe care tocmai vi l-am trimis.

.