Java 8-strömmar tillåter utvecklare att extrahera exakta data från en stor samling med hjälp av en uppsättning fördefinierade operationer.
Före lanseringen av Java 8 skulle användningen av termen “ström” i Java automatiskt associeras med I/O. Java 8 introducerade dock en ström som kan hänvisas till som en uppsättning beräkningssteg kedjade samman i vad som vanligtvis kallas en “strömpipeline”.
Den här artikeln kommer att introducera dig till Java 8-strömmar och visa hur de kan vara användbara i dina projekt.
Vad är en stream?
En ström är ett Java-gränssnitt som tar en källa, utför en uppsättning operationer för att extrahera specifik 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ömpipeline börjar alltid med en källa. Typen av källa beror på vilken typ av data du har att göra med, men två av de mer populära är arrayer och samlingar.
För att omvandla samlingen till en första ström måste du lägga till 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 operera på den.
Efter att alla nödvändiga mellanoperationer har utfö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 dess behövde Java-utvecklare fortfarande extrahera specialiserad data från en samling allmänna data.
Låt oss säga att du har en lista med slumpmässiga tecken som kombineras med slumpmässiga siffror för att bilda unika strängvärden, men du vill bara ha de värden som börjar med tecknet “C” och du vill ordna resultatet i stigande ordning. Så här skulle du extrahera den datan utan strömmar.
Exempel på filtrering och sortering av värden utan strömmar
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List<String> 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"
);
//declare the array list will store needed values
List<String> requiredValues = new ArrayList<>();
//extracting the required values and storing them in reqquiredValues
randomValues.forEach(value -> {
if(value.startsWith("C")) {
requiredValues.add(value);
}
});
//sort the requiredValues in ascending order
requiredValues.sort((String value1, String value2) -> value1.compareTo(value2));
//print each value to the console
requiredValues.forEach((String value) -> System.out.println(value));
}
}
Du måste också deklarera och initiera arraylistan oavsett om du använder strömmar eller någon annan metod för extraktion. Vad du inte skulle behöva göra om du använde strömmar är att deklarera en ny variabel för att hålla de nödvändiga värdena, och inte heller skapa de andra fem plusraderna med kod i exemplet ovan.
Koden ovan producerar följande utdata i konsolen:
C11
C12
C13
C14
C15
C16
Livet med strömmar
Inom programmering talar effektivitet om att producera samma resultat med betydligt mindre kod. Detta är precis vad en strömpipeline 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.”
För att fortsätta med vårt exempel ovan, är det här hur introduktionen av strömmar förvandlar hela programmet.
Filtrera och sortera värden med ett strömexempel
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List<String> 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"
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith("C")).sorted().forEach(System.out::println);
}
}
Koden ovan visar hur kraftfullt stream-gränssnittet är. Den tar en lista med slumpmässiga arrayvärden och omvandlar den till en ström med hjälp av ström() fungera. Strömmen reduceras sedan till en arraylista 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 är C värden är slumpmässigt ordnade i arraylistan. Om du skulle skriva ut strömmen vid denna tidpunkt i pipelinen, värdet C15 skulle skrivas ut först. Därför sortera() funktionen introduceras till strömpipelinen för att ordna om den nya arrayen i stigande ordning.
Den sista funktionen i strömledningen är en för varje() fungera. Detta är en terminalfunktion som används för att stoppa strömledningen 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ömpipeline.
En strömpipeline 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 att välja mellan.) Men mellan dessa två avsnitt finns en lista med sex mellanoperationer som du kan använda.
I vårt exempel ovan används endast två av dessa mellanliggande operationer—filtrera() och sortera(). Den mellanliggande operation 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 var med gemener, och vi utförde samma mellanliggande operationer på dem, skulle vi få följande resultat.
Utföra filter- och sorteringsoperationer på gemener exempel
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List<String> 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"
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith("C")).sorted().forEach(System.out::println);
}
}
Koden ovan kommer att producera följande värden i konsolen:
C11
C12
C14
C15
Det enda problemet med utgången ovan är att den inte exakt representerar alla C värden i vår matrislista. Ett bra sätt att åtgärda detta lilla fel är att introducera en annan mellanoperation i strömledningen; denna operation är känd som Karta() fungera.
Använda kartfunktionens exempel
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List<String> 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"
);
//transforms all lower case characters to upper case,
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().map(String::toUpperCase).filter(value->value.startsWith("C")).sorted().forEach(System.out::println);
}
}
De Karta() funktion omvandlar ett objekt från ett tillstånd till ett annat; i vårt exempel ovan omvandlar den alla gemener i arraylistan till versaler.
Att placera Karta() funktion strax före filtrera() funktion 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 C värden i arraylistan.
C11
C12
C13
C14
C15
C16
De andra tre mellanliggande operationerna som du kan använda i dina applikationer inkluderar:
Java 8-strömmar underlättar skapandet av effektiv kod
Med Java 8-strömmar kan du extrahera extra specifik, relevant data från en stor källa med en rad kod. Så länge du inkluderar initialen ström() funktion och en terminaloperatör kan du använda vilken kombination av mellanoperationer som helst som ger passande utgångar för ditt mål.
Om du undrar över kodraden som finns i vår filtrera() fungera; det är känt som ett “lambda-uttryck”. Lambda-uttryck är en annan funktion som introduceras med Java 8, och den har många nuggets som du kan ha nytta av.
Om författaren
Kadeisha Kean (39 artiklar publicerade)
Kadeisha Kean är en full-stack mjukvaruutvecklare och teknisk/teknikskribent. Hon har den distinkta förmågan att förenkla några av de mest komplexa tekniska koncepten; producera material som lätt kan förstås av alla nybörjare. Hon brinner för att skriva, utveckla intressant programvara och att 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, free e-böcker och exklusiva erbjudanden!
Klicka här för att prenumerera
