Nyheter i Android, Telefoner, Prylar Och Recensioner

Java-strömmar för nybörjare: En introduktion till att använda strömmar i Java

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.

Relaterad  Tillgängligheten för GeForce RTX 2060 12GB-kort kommer att förbättras under de kommande veckorna

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.

Relaterad  "Världsmästare" på 2 veckor samlade in 338,7 miljoner rubel i kassan med en budget på 700 miljoner

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.

Relaterad  Hur du lösenordsskyddar och låser dina Google Sheets

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