1. Kontroll
Jag tror att du kanske redan är uttråkad av att lära dig hur man länkar samman dataströmmar. Du vill äntligen göra något med datan.
Klassen Stream
har tre standardmetoder som inte konstruerar strömmar, utan istället kontrollerar vilken typ av data som finns i dem. Dessa metoder är: anyMatch()
, allMatch()
, och noneMatch()
.
boolean anyMatch(rule)
metod
Denna metod kontrollerar om strömmen har minst ett element som uppfyller regeln som skickas till metoden. Om det finns ett sådant element returnerar metoden , true
annars false
.
Exempel
Koda | Notera |
---|---|
|
|
|
|
|
|
I det sista exemplet behåller vi först bara de element som är mindre än noll, och sedan kontrollerar vi resultatet för att se om något av de filtrerade elementen är större än noll. Sådana element finns naturligtvis inte längre.
boolesk allMatch(rule) metod
Denna metod kontrollerar om alla element i strömmen matchar regeln (även känt som ett predikat). Regeln skickas som ett argument till metoden:
Koda | Notera |
---|---|
|
(alla element större än noll) |
|
(finns det element mindre än eller lika med noll?) |
|
(vi behöll de element som är mindre än noll) |
I det sista exemplet tillåter vi först bara element som är mindre än noll att passera genom filtret, och sedan kontrollerar vi om alla kvarhållna element är mindre än noll. Kontrollen ger ett positivt resultat.
boolean noneMatch(rule)-metod
Metoden noneMatch()
kontrollerar om strömmen inte har några element som matchar den godkända regeln. Det är som motsatsen till anyMatch()
metoden.
Koda | Notera |
---|---|
|
|
|
|
|
|
2. Verktygsklasser: Optional
klass
Ibland är det väldigt obekvämt för programmerare att arbeta med null
referenser. Anta till exempel att du jämför två strängar. Om båda variablerna inte är null
, kan du helt enkelt ringa s1.equals(s2)
, och allt kommer att fungera. Men om det s1
skulle kunna vara null
så måste du skriva kod som hanterar denna situation för att undvika en NullPointerException
.
Det var därför programmerare kom med verktygsklassen Optional<T>
. Dess kod ser ungefär ut så här:
Koda | Notera |
---|---|
|
Kontrollerar om värdet inte är null Kontrollerar om värdet är null Returnerar det lagrade värdet. Kastar ett undantag om värdet är null. Returnerar det lagrade icke-nullvärdet. Eller om det lagrade värdet är null returnerar värdet som skickas in som ett metodargument. Returnerar det lagrade icke-nullvärdet eller ger ett undantag om värdet är null. |
Syftet med denna klass är helt enkelt att lagra ett T-objekt (en referens till ett objekt vars typ är T). Objektreferensen inuti ett Optional<T>
objekt kan vara null
.
Den här klassen låter programmerare skriva lite snyggare kod. Låt oss jämföra:
Använder tillval | Använder inte Valfritt |
---|---|
|
|
Ett Optional
objekt kan alltid jämföras med ett annat Optional
objekt med equals
metoden, även om de lagrar null
referenser.
Enkelt sagt Optional
låter klassen dig skriva "vackera" kontroller för null
och "vackra" åtgärder i händelse av att ett Optional
objekt lagrar ett null
värde.
3. Hitta element
Låt oss återgå till Stream
klassen. Klassen Stream
har ytterligare fyra metoder som låter dig söka efter element i en ström. Dessa metoder är findFirst()
, findAny()
, min()
, och max()
.
Optional<T> findFirst()
metod
Metoden findFirst()
returnerar helt enkelt det första elementet i strömmen. Det är allt det gör.
Det mer intressanta att notera här är att metoden inte returnerar ett T
objekt, utan snarare ett Optional<T>
omslagsobjekt. Detta säkerställer att metoden aldrig kommer tillbaka null
efter att ha misslyckats med att hitta ett objekt.
Exempel:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello
För att förtydliga, låt oss dela upp den sista raden i flera rader:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello
Den sista get()
metoden är att helt enkelt hämta värdet som är lagrat inuti Optional
objektet.
Optional<T> findAny()
metod
Metoden findAny()
returnerar alla element från strömmen och slutar där. Denna metod liknar findFirst()
, men den är utmärkt för strömmar som används i parallella operationer.
När man bearbetar strömmar parallellt kan det vara att ett element redan har hittats i någon del av en ström, men det är ännu inte klart om det är det första eller inte.
Om många element har matchat alla filter, och det är viktigt för programmeraren att få exakt det första av dem, så findFirst()
är metoden det som ska kallas. Om programmeraren vet att i verkligheten 0 eller 1 element kommer att matcha alla filter, räcker det att helt enkelt ringa — findAny()
och det kommer att gå snabbare.
Optional<T> min(Comparator<T>)
metod
Metoden min()
använder ett comparator
objekt för att jämföra alla element i strömmen och returnerar minimielementet. Det bekvämaste sättet att definiera ett komparatorobjekt är med en lambdafunktion.
Exempel på sökning efter den kortaste strängen:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();
Optional<T> max(Comparator<T>)
metod
Metoden max()
använder ett comparator
objekt för att jämföra alla element i strömmen och returnerar det maximala elementet. Det bekvämaste sättet att definiera ett komparatorobjekt är med en lambdafunktion.
Exempel på sökning efter den längsta strängen:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
GO TO FULL VERSION