Med Java 8-strömmar kan utvecklare extrahera exakta data från en stor samling med en uppsättning fördefinierade operationer.

Innan Java 8 släpptes skulle termen "stream" i Java automatiskt associeras med I / O. Java 8 introducerade emellertid en ström som kan hänvisas till som en uppsättning beräkningssteg kedjade ihop i vad som vanligtvis kallas en "strömrörledning".

Den här artikeln presenterar dig för Java 8-strömmar och visar hur de kan vara användbara i dina projekt.

Vad är en ström?

En ström är ett Java-gränssnitt som tar en källa, utför en uppsättning operationer för att extrahera specifika data och sedan tillhandahåller dessa data till applikationen för användning. I huvudsak låter det dig extrahera specialiserad data från en samling generaliserade data.

Hur strömmar fungerar

En strömrörledning börjar alltid med en källa. Källtypen är beroende av vilken typ av data du har att göra med, men två av de mer populära är matriser och samlingar.

För att förvandla samlingen till en första ström måste du lägga till

instagram viewer
ström() funktion till källan. Detta kommer att placera källan i strömledningen där flera olika mellanliggande operationer (t.ex. filtrera() och sortera()) kan fungera på den.

När alla nödvändiga mellanliggande operationer har genomförts kan du införa en terminaloperation (t.ex. för varje()), som kommer att producera tidigare extraherade data från källan.

Livet utan strömmar

Java 8 släpptes 2014, men innan det behövdes Java-utvecklare fortfarande att extrahera specialdata från en samling allmänna data.

Låt oss säga att du har en lista med slumpmässiga tecken som kombineras med slumptal för att bilda unika strängvärden, men du vill bara ha värdena som börjar med tecknet "C" och du vill ordna resultatet i stigande ordning. Så här skulle du extrahera data utan strömmar.

Relaterad: Vad du behöver veta om att använda strängar i Java

Filtrering och sortering av värden utan strömmar Exempel


importera java.util. ArrayList;
importera java.util. Arrayer;
importera java.util. Lista;
allmän klass Main {
public static void main (String [] args) {
// deklarera och initialisera matrislistan
Lista 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"
);
// deklarera matrislistan kommer att lagra nödvändiga värden
Lista requiredValues ​​= new ArrayList <> ();
// extrahera de nödvändiga värdena och lagra dem i reqquiredValues
randomValues.forEach (värde -> {
if (value.startsWith ("C")) {
requiredValues.add (värde);
}
});
// sortera de obligatoriska värdena i stigande ordning
requiredValues.sort ((String value1, String value2) -> value1.compareTo (value2));
// skriv ut varje värde till konsolen
requiredValues.forEach ((Strängvärde) -> System.out.println (värde));
}
}

Du måste också deklarera och initiera matrislistan om du använder strömmar eller någon annan utvinningsmetod. Vad du inte behöver göra om du använder strömmar är att deklarera en ny variabel som innehåller de nödvändiga värdena eller skapa de andra fem plus raderna med kod i exemplet ovan.

Relaterad: Hur man skapar och utför operationer på arrays i Java

Koden ovan ger följande utdata i konsolen:


C11
C12
C13
C14
C15
C16

Livet med strömmar

I programmering talar effektivitet för att producera samma resultat med betydligt mindre kod. Det är precis vad en strömrörledning gör för en programmerare. Så nästa gång någon frågar: "varför är det viktigt att använda strömmar i ditt projekt?" Enkelt uttryckt: "strömmar stöder effektiv programmering."

Fortsatt med vårt exempel ovan, så här transformerar introduktion av strömningar hela programmet.

Filtrering och sortering av värden med ett strömsexempel


importera java.util. Arrayer;
importera java.util. Lista;
allmän klass Main {
public static void main (String [] args) {
// deklarera och initialisera matrislistan
Lista 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"
);
// hämtar endast värden som börjar med C, sorterar dem och skriver ut dem till konsolen.
randomValues.stream (). filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

Koden ovan visar hur kraftfullt strömgränssnittet är. Det tar en lista över slumpmässiga matrisvärden och förvandlar den till en ström med hjälp av ström() fungera. Strömmen reduceras sedan till en matrislista som innehåller de nödvändiga värdena (vilket är alla värden som börjar med C), använda filtrera() fungera.

Som du kan se i exemplet ovan, C värden ordnas slumpmässigt i matrislistan. Om du skulle skriva ut strömmen vid denna punkt i rörledningen, värdet C15 skulle skrivas ut först. Därför sortera() funktionen introduceras i strömrörledningen för att ordna om den nya matrisen i stigande ordning.

Den sista funktionen i strömrörledningen är en för varje() fungera. Detta är en terminalfunktion som används för att stoppa strömrörledningen och ger följande resultat i konsolen:


C11
C12
C13
C14
C15
C16

Det finns en omfattande lista över mellanliggande operationer som kan användas i en strömledning.

En strömrörledning börjar alltid med en enda källa och en ström() funktion och slutar alltid med en enda terminaloperation (även om det finns flera olika välj mellan.) Men mellan dessa två avsnitt finns en lista med sex mellanliggande operationer som du kan använda sig av.

I vårt exempel ovan används endast två av dessa mellanliggande operationerfiltrera() och sortera(). Den mellanliggande åtgärd som du väljer beror på de uppgifter du vill utföra.

Om något av värdena som börjar med "C" i vår matrislista ovan låg i gemener, och vi utförde samma mellanliggande operationer på dem, skulle vi få följande resultat.

Utföra filter- och sorteringsåtgärder på gemener Exempel


importera java.util. Arrayer;
importera java.util. Lista;
allmän klass Main {
public static void main (String [] args) {
// deklarera och initialisera matrislistan
Lista 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"
);
// hämtar endast värden som börjar med C, sorterar dem och skriver ut dem till konsolen.
randomValues.stream (). filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

Koden ovan producerar följande värden i konsolen:


C11
C12
C14
C15

Det enda problemet med utdata ovan är att det inte representerar alla exakt värden i vår matrislista. Ett bra sätt att åtgärda detta lilla fel är att införa ytterligare en mellanliggande operation till strömrörledningen. denna operation kallas Karta() fungera.

Använda exempel på kartfunktion


importera java.util. Arrayer;
importera java.util. Lista;
allmän klass Main {
public static void main (String [] args) {
// deklarera och initialisera matrislistan
Lista 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"
);
// förvandlar alla gemener till versaler,
// hämtar endast värden som börjar med C, sorterar dem och skriver ut dem till konsolen.
randomValues.stream (). map (String:: toUpperCase) .filter (value-> value.startsWith ("C")). sorted (). forEach (System.out:: println);
}
}

De Karta() funktion förvandlar ett objekt från ett tillstånd till ett annat; i vårt exempel ovan förvandlas alla små bokstäver i matrislistan till versaler.

Placera Karta() funktion precis innan filtrera() funktionen hämtar alla värden som börjar med C från arraylistan.

Koden ovan ger följande resultat i konsolen, som framgångsrikt representerar alla värden i matrislistan.


C11
C12
C13
C14
C15
C16

De andra tre mellanliggande operationerna som du kan använda i dina applikationer inkluderar:

  • titt()
  • begränsa()
  • hoppa()

Java 8-strömmar underlättar skapandet av effektiv kod

Med Java 8-strömmar kan du extrahera extra specifika, relevanta data från en stor källa med en kodrad. Så länge du inkluderar initialen ström() och en terminaloperatör, kan du använda vilken kombination av mellanliggande operationer som helst som passar utgångar för ditt mål.

Om du undrar över raden kod som finns i vår filtrera() fungera; det är känt som ett "lambdauttryck." Lambda-uttryck är en annan funktion som introduceras med Java 8, och den har många nuggets som du kanske tycker är användbara.

E-post
En snabb introduktion till Java 8 Lambdas

Om du är en Java-programmerare och du är intresserad av att lära dig mer om Java 8 lambdas, kommer vi i den här artikeln att titta närmare på lambdas syntax och användning.

Läs Nästa

Relaterade ämnen
  • Programmering
  • Java
  • Kodningshandledning
Om författaren
Kadeisha Kean (13 artiklar publicerade)

Kadeisha Kean är en full-stack programvaruutvecklare och teknisk / teknikförfattare. Hon har den distinkta förmågan att förenkla några av de mest komplexa tekniska begreppen; producera material som lätt kan förstås av alla nybörjare. Hon brinner för att skriva, utveckla intressant programvara och resa runt i världen (genom dokumentärer).

Mer från Kadeisha Kean

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e-böcker och exklusiva erbjudanden!

Ett steg till…!

Bekräfta din e-postadress i e-postmeddelandet som vi just skickade till dig.

.