1. Controleren
Ik denk dat je het misschien al beu bent om te leren hoe je datastromen aan elkaar kunt koppelen. Je wilt eindelijk iets met de data doen.
De Stream
klasse heeft drie standaardmethoden die geen streams construeren, maar in plaats daarvan controleren wat voor soort gegevens erin staan. Deze methoden zijn: anyMatch()
, allMatch()
, en noneMatch()
.
boolean anyMatch(rule)
methode
Deze methode controleert of de stream minstens één element heeft dat voldoet aan de regel die aan de methode wordt doorgegeven. Als er zo'n element is, retourneert de methode true
, anders false
.
Voorbeelden
Code | Opmerking |
---|---|
|
|
|
|
|
|
In het laatste voorbeeld behouden we eerst alleen de elementen die kleiner zijn dan nul, en vervolgens controleren we het resultaat om te zien of een van de gefilterde elementen groter is dan nul. Dergelijke elementen zijn er natuurlijk niet meer.
booleaanse methode allMatch(regel).
Deze methode controleert of alle elementen in de stream overeenkomen met de regel (ook wel predikaat genoemd). De regel wordt als argument doorgegeven aan de methode:
Code | Opmerking |
---|---|
|
(alle elementen groter dan nul) |
|
(zijn er elementen kleiner dan of gelijk aan nul?) |
|
(we hebben de elementen behouden die kleiner zijn dan nul) |
In het laatste voorbeeld laten we eerst alleen elementen die kleiner zijn dan nul door het filter, en dan controleren we of alle behouden elementen kleiner zijn dan nul. De controle levert een positief resultaat op.
booleaanse methode noneMatch(regel).
De noneMatch()
methode controleert of de stream geen elementen bevat die overeenkomen met de doorgegeven regel. Het is als het tegenovergestelde van de anyMatch()
methode.
Code | Opmerking |
---|---|
|
|
|
|
|
|
2. Nutsklassen: Optional
klasse
Soms is het voor programmeurs erg onhandig om met null
referenties te werken. Stel dat u twee tekenreeksen vergelijkt. Als beide variabelen dat niet zijn null
, dan kun je gewoon bellen s1.equals(s2)
en alles zal werken. Maar als s1
het zou kunnen null
, dan moet je code schrijven die deze situatie afhandelt om een NullPointerException
.
Daarom bedachten programmeurs de Optional<T>
utility-klasse. De code ziet er ongeveer zo uit:
Code | Opmerking |
---|---|
|
Controleert of de waarde niet klopt. null Controleert of de waarde klopt. null Geeft de opgeslagen waarde terug. Genereert een uitzondering als de waarde null is. Retourneert de opgeslagen niet-null-waarde. Of als de opgeslagen waarde null , retourneert dan de waarde die is doorgegeven als een methodeargument Geeft de opgeslagen niet-null-waarde terug of genereert een uitzondering als de waarde null is. |
Het doel van deze klasse is simpelweg om een T-object op te slaan (een verwijzing naar een object waarvan het type T is). De objectreferentie binnen een Optional<T>
object kan null
.
Met deze klasse kunnen programmeurs iets mooiere code schrijven. Laten we vergelijken:
Optioneel gebruiken | Optioneel niet gebruiken |
---|---|
|
|
Het ene Optional
object kan altijd worden vergeleken met een ander Optional
object met behulp van de equals
methode, zelfs als ze null
referenties opslaan.
Simpel gezegd, de Optional
klasse laat je "mooie" controles schrijven voor null
en "mooie" acties in het geval dat een Optional
object een null
waarde opslaat.
3. Elementen zoeken
Laten we teruggaan naar de Stream
klas. De Stream
klasse heeft nog 4 methoden waarmee u naar elementen in een stroom kunt zoeken. Deze methoden zijn findFirst()
, findAny()
, min()
, en max()
.
Optional<T> findFirst()
methode
De findFirst()
methode retourneert eenvoudigweg het eerste element in de stream. Dat is alles wat het doet.
Het interessantere om hier op te merken is dat de methode geen T
object retourneert, maar eerder een Optional<T>
wrapper-object. Dit zorgt ervoor dat de methode nooit terugkeert null
nadat een object niet is gevonden.
Voorbeeld:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello
Laten we voor meer duidelijkheid de laatste regel opsplitsen in verschillende regels:
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
De laatste get()
methode is simpelweg het ophalen van de waarde die in het Optional
object is opgeslagen.
Optional<T> findAny()
methode
De findAny()
methode retourneert elk element uit de stream en eindigt daar. Deze methode is vergelijkbaar met findFirst()
, maar is geweldig voor streams die worden gebruikt in parallelle bewerkingen.
Wanneer streams parallel worden verwerkt, kan het zijn dat er al een element is gevonden in een deel van een stream, maar het is nog niet duidelijk of dit het eerste is of niet.
Als veel elementen overeenkomen met alle filters, en het is belangrijk voor de programmeur om precies de eerste te krijgen, dan findFirst()
moet de methode worden genoemd. Als de programmeur weet dat in werkelijkheid 0 of 1 element overeenkomt met alle filters, volstaat het om gewoon te bellen findAny()
- en dit zal sneller zijn.
Optional<T> min(Comparator<T>)
methode
De min()
methode gebruikt een comparator
object om alle elementen in de stroom te vergelijken en retourneert het minimale element. De handigste manier om een comparatorobject te definiëren is met een lambda-functie.
Voorbeeld van zoeken naar de kortste string:
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>)
methode
De max()
methode gebruikt een comparator
object om alle elementen in de stroom te vergelijken en retourneert het maximale element. De handigste manier om een comparatorobject te definiëren is met een lambda-functie.
Voorbeeld van zoeken naar de langste string:
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