Met Java 8-streams kunnen ontwikkelaars nauwkeurige gegevens uit een grote verzameling extraheren met behulp van een reeks vooraf gedefinieerde bewerkingen.
Vóór de release van Java 8 werd het gebruik van de term "stream" in Java automatisch geassocieerd met I / O. Java 8 introduceerde echter een stroom die kan worden aangeduid als een reeks rekenstappen die aan elkaar zijn geketend in wat gewoonlijk een "stroompijplijn" wordt genoemd.
Dit artikel laat u kennismaken met Java 8-streams en laat zien hoe deze nuttig kunnen zijn in uw projecten.
Wat is een stream?
Een stream is een Java-interface die een bron neemt, een reeks bewerkingen uitvoert om specifieke gegevens te extraheren en die gegevens vervolgens aan de toepassing levert voor gebruik. In wezen stelt het u in staat om gespecialiseerde gegevens te extraheren uit een verzameling algemene gegevens.
Hoe streams werken
Een stroompijplijn begint altijd met een bron. Het type bron is afhankelijk van het type gegevens waarmee u te maken hebt, maar twee van de meest populaire zijn arrays en verzamelingen.
Om de verzameling om te zetten in een eerste stream, moet je het stroom() functie naar de bron. Hierdoor wordt de bron in de stroompijpleiding geplaatst waar verschillende tussenliggende bewerkingen (zoals filter() en soort()) kunnen erop opereren.
Nadat alle vereiste tussenliggende bewerkingen zijn uitgevoerd, kunt u een terminalbewerking invoeren (zoals voor elk ()), die de eerder geëxtraheerde gegevens uit de bron zal produceren.
Leven zonder streams
Java 8 werd uitgebracht in 2014, maar daarvoor moesten Java-ontwikkelaars nog steeds gespecialiseerde gegevens extraheren uit een verzameling algemene gegevens.
Stel dat u een lijst met willekeurige tekens heeft die worden gecombineerd met willekeurige getallen om unieke tekenreekswaarden te vormen, maar u wilt alleen de waarden die beginnen met het teken “C” en u wilt het resultaat oplopend rangschikken bestellen. Dit is hoe je die gegevens zou extraheren zonder streams.
Verwant: Wat u moet weten over het gebruik van strings in Java
Waarden filteren en sorteren zonder streams Voorbeeld
importeer java.util. ArrayList;
importeer java.util. Arrays;
importeer java.util. Lijst;
openbare klas Main {
public static void main (String [] args) {
// declareer en initialiseer de arraylijst
Lijst 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"
);
// verklaar dat de arraylijst de benodigde waarden zal opslaan
Lijst requiredValues = nieuwe ArrayList <> ();
// de vereiste waarden extraheren en opslaan in reqquiredValues
randomValues.forEach (waarde -> {
if (value.startsWith ("C")) {
requiredValues.add (waarde);
}
});
// sorteer de vereiste waarden in oplopende volgorde
requiredValues.sort ((String waarde1, String waarde2) -> waarde1.compareTo (waarde2));
// print elke waarde naar de console
requiredValues.forEach ((String waarde) -> System.out.println (waarde));
}
}
U moet ook de arraylijst declareren en initialiseren, ongeacht of u streams of een andere extractiemethode gebruikt. Wat u niet zou hoeven doen als u streams zou gebruiken, is een nieuwe variabele declareren voor de vereiste waarden, noch de andere vijf plusregels code maken in het bovenstaande voorbeeld.
Verwant: Bewerkingen maken en uitvoeren op arrays in Java
De bovenstaande code produceert de volgende uitvoer in de console:
C11
C12
C13
C14
C15
C16
Leven met streams
Bij het programmeren betekent efficiëntie hetzelfde resultaat produceren met aanzienlijk minder code. Dit is precies wat een streampijplijn doet voor een programmeur. Dus de volgende keer dat iemand vraagt: "waarom is het belangrijk om streams in je project te gebruiken?" Simpel gezegd: "streams ondersteunen efficiënte programmering."
Als we doorgaan met ons voorbeeld hierboven, is dit hoe het introduceren van streams het hele programma transformeert.
Waarden filteren en sorteren met een stroomvoorbeeld
importeer java.util. Arrays;
importeer java.util. Lijst;
openbare klas Main {
public static void main (String [] args) {
// declareer en initialiseer de arraylijst
Lijst 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"
);
// haalt alleen waarden op die beginnen met C, sorteert ze en drukt ze af naar de console.
randomValues.stream (). filter (waarde-> waarde.startsWith ("C")). gesorteerd (). forEach (System.out:: println);
}
}
De bovenstaande code laat zien hoe krachtig de stream-interface is. Het neemt een lijst met willekeurige matrixwaarden en transformeert deze in een stream met behulp van de stroom() functie. De stream wordt vervolgens teruggebracht tot een arraylijst die de vereiste waarden bevat (dat zijn alle waarden die beginnen met C), de... gebruiken filter() functie.
Zoals u in het bovenstaande voorbeeld kunt zien, is de C waarden worden willekeurig gerangschikt in de arraylijst. Als u de stream op dit punt in de pijplijn zou afdrukken, is de waarde C15 zou eerst worden afgedrukt. Daarom, de soort() functie wordt geïntroduceerd in de stroompijplijn om de nieuwe array in oplopende volgorde te herschikken.
De laatste functie in de stroompijplijn is een voor elk () functie. Dit is een terminalfunctie die wordt gebruikt om de streampijplijn te stoppen en de volgende resultaten in de console produceert:
C11
C12
C13
C14
C15
C16
Er is een uitgebreide lijst met tussenliggende bewerkingen die kunnen worden gebruikt in een stroompijplijn.
Een streampijplijn begint altijd met een enkele bron en een stroom() functie, en eindigt altijd met een enkele terminalbewerking (hoewel er verschillende zijn kies uit.) Maar tussen deze twee secties is een lijst van zes tussenliggende bewerkingen die u kunt gebruik.
In ons bovenstaande voorbeeld worden slechts twee van deze tussenliggende bewerkingen gebruiktfilter() en soort(). De tussenliggende handeling die u kiest, is afhankelijk van de taken die u wilt uitvoeren.
Als een van de waarden die beginnen met 'C' in onze arraylijst hierboven in kleine letters zijn, en we hebben dezelfde tussenliggende bewerkingen erop uitgevoerd, zouden we het volgende resultaat krijgen.
Filter- en sorteerbewerkingen uitvoeren op kleine letters Voorbeeld
importeer java.util. Arrays;
importeer java.util. Lijst;
openbare klas Main {
public static void main (String [] args) {
// declareer en initialiseer de arraylijst
Lijst 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"
);
// haalt alleen waarden op die beginnen met C, sorteert ze en drukt ze af naar de console.
randomValues.stream (). filter (waarde-> waarde.startsWith ("C")). gesorteerd (). forEach (System.out:: println);
}
}
De bovenstaande code produceert de volgende waarden in de console:
C11
C12
C14
C15
Het enige probleem met de bovenstaande uitvoer is dat deze niet alle C waarden in onze arraylijst. Een goede manier om deze kleine fout op te lossen, is door een andere tussenliggende bewerking in de stroompijplijn te introduceren; deze bewerking staat bekend als de kaart() functie.
Het voorbeeld van de kaartfunctie gebruiken
importeer java.util. Arrays;
importeer java.util. Lijst;
openbare klas Main {
public static void main (String [] args) {
// declareer en initialiseer de arraylijst
Lijst 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"
);
// transformeert alle kleine letters naar hoofdletters,
// haalt alleen waarden op die beginnen met C, sorteert ze en drukt ze af naar de console.
randomValues.stream (). map (String:: toUpperCase) .filter (waarde-> waarde.startsWith ("C")). gesorteerd (). forEach (System.out:: println);
}
}
De kaart() functie transformeert een object van de ene toestand naar de andere; in ons voorbeeld hierboven transformeert het alle kleine letters in de arraylijst naar hoofdletters.
Het plaatsen van het kaart() functie net voor de filter() functie haalt alle waarden op die beginnen met C uit de arraylijst.
De bovenstaande code produceert het volgende resultaat in de console en vertegenwoordigt met succes alle C waarden in de arraylijst.
C11
C12
C13
C14
C15
C16
De andere drie tussenliggende bewerkingen die u in uw toepassingen kunt gebruiken, zijn onder meer:
- kijkje()
- limiet()
- overspringen()
Java 8-streams vergemakkelijken het creëren van efficiënte code
Met Java 8-streams kunt u met één regel code extra specifieke, relevante data uit een grote bron halen. Zolang u de initiaal opneemt stroom() functie en een terminaloperator, kunt u elke combinatie van tussenliggende bewerkingen gebruiken die een passende output voor uw doel opleveren.
Als u zich afvraagt welke regel code is ingesloten in ons filter() functie; het staat bekend als een "lambda-uitdrukking". Lambda-expressies zijn een andere functie die is geïntroduceerd met Java 8, en het heeft veel klompjes die je misschien handig vindt.
Als je een Java-programmeur bent en je wilt meer weten over Java 8 lambda's, dan gaan we in dit artikel de lambda-syntaxis en het gebruik van naderbij bekijken.
Lees Volgende
- Programmeren
- Java
- Zelfstudies over codering
Kadeisha Kean is een full-stack softwareontwikkelaar en technisch / technologisch schrijver. Ze heeft het onderscheidende vermogen om enkele van de meest complexe technologische concepten te vereenvoudigen; materiaal produceren dat gemakkelijk kan worden begrepen door elke beginneling op het gebied van technologie. Ze is gepassioneerd door schrijven, interessante software ontwikkelen en de wereld rondreizen (via documentaires).
Abonneer op onze nieuwsbrief
Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!
Nog een stap…!
Bevestig uw e-mailadres in de e-mail die we u zojuist hebben gestuurd.