Java 8 Streams – Objekte aus einer Liste filtern
Einleitung
In den beiden vorherigen Java 8 Stream Tutorials haben wir kennen gelernt, wie man aus einer Liste eine Map erstellt und wie man Objekte einer Liste in eine neue Klassen mappt. In diesem Tutorial wird es darum gehen wie man mit der Hilfe der Java 8 Stream filter Methode einzelne Objekte aus einem Stream selektieren kann
Voraussetzung
- Java Kentnisse
Objekte aus einem Stream filtern mit der filter() Methode
In diversen Projekten habe ich die Erfahrung gemacht, dass es unter Umständen notwendig ist, einzelne Objekte aus einer Liste zu selektieren. Hierfür bietet sich bei Java 8 Streams die filter Methode an. Mit der Filter Methode können Objekte im Stream nach einen oder mehreren Kriterien geprüft werden. Wenn die Prüfung eine true als Ergebnis liefert, dann bleibt das Objekt in dem Stream. Bei einem false wird es nicht übernommen und steht nicht mehr zur weiteren Verarbeitung zur Verfügung
Im folgenden haben wir eine Klasse Customer.java, von dem wir drei Objekte weiter unten in der ArrayList hinzufügen werden.
package de.ertantoker.tutorial.model; public class Customer { private String id; private String firstname; private String lastname; public Customer(String id, String firstname, String lastname) { this.id = id; this.firstname = firstname; this.lastname = lastname; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } }
Der folgende Codeabschnitt zeigt einen Stream der drei Customer Objekte beinhaltet. In der Filter Methode des Streams sehen wir, dass der searchTerm mit dem firstname der Customer Objekte verglichen wird. Wichtig ist hier zu wissen, dass alle Objekte im Stream hier verglichen werden.
Nach dem Vergleich bleiben die Objekte im Stream, die in der Filter Methode ein true zurück geliefert haben!
In diesem Fall gehen wir davon aus, dass es nur ein Ergebnis gibt und greifen daher mit findFirst() auf das erste gefundene Customer im Stream. Die Methode ifPresent gibt dann den Nachnamen des Customer Objektes, welches gefunden wurde. Wichtig hier ist es, dass ifPresent nur dann ausgeführt wird, wenn es auch ein Ergebnis gibt. Dies bedeutet, dass wenn kein Objekt über findFirst gefunden werden konnte, dass dann ifPresent auch nicht ausgeführt wird.
package de.ertantoker.tutorial; import de.ertantoker.tutorial.response.CustomerResponse; import de.ertantoker.tutorial.model.Customer; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Java8Filter { public static void main(String[] args) { Customer customer1 = new Customer("1", "Albert", "Einstein"); Customer customer2 = new Customer("2", "Otto", "Hahn"); Customer customer3 = new Customer("3", "Isaac", "Newton"); List customerList = Arrays.asList(customer1, customer2, customer3); String searchTerm = "Albert"; customerList .stream() .filter(customer -> searchTerm.equals(customer.getFirstname())) .findFirst() .ifPresent(customer -> System.out.println("Found customer lastname: " + customer.getLastname())); } }
Die Verkettung der Filter Methode
Die Filter Methode kann man entweder kompliziert aufbauen in dem man in der Methode mittelt UND Verknüpfung weitere Bedingungen implementiert oder man verkettet die Filter Methoden miteinander.
Folgender Codeabschnitt zeigt zwei Filter Methoden. Die erste Filter Methode filtert die Customer Objekte nach dem Vornamen und die Zweite nach dem Nachnamen. In diesem Fall würden nur die Objekte im Stream erhalten bleiben, die beide Filter Bedingungen erfüllen.
package de.ertantoker.tutorial; import de.ertantoker.tutorial.response.CustomerResponse; import de.ertantoker.tutorial.model.Customer; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Java8Filter { public static void main(String[] args) { Customer customer1 = new Customer("1", "Albert", "Einstein"); Customer customer2 = new Customer("2", "Otto", "Hahn"); Customer customer3 = new Customer("3", "Isaac", "Newton"); List customerList = Arrays.asList(customer1, customer2, customer3); String searchTermFirstname = "Albert"; String searchTermLastname = "Einstein"; customerList .stream() .filter(customer -> searchTermFirstname.equals(customer.getFirstname())) .filter(customer -> searchTermLastname.equals(customer.getLastname())) .findFirst() .ifPresent(customer -> System.out.println("Found customer lastname: " + customer.getLastname())); } }
Das Ergebnis
Die Filter Methode von Java 8 Streams biete eine elegante und lesbare an Möglichkeiten Objekte aus einem Stream zu filtern. Durch die Verkettung von Filter Methoden ist man als Entwickler in der Lage Code zu schreiben, welches recht einfach zu lesen ist.
Ich hoffe euch hat mein kleines Tutorial gefallen. Solltet ihr Fragen, Kritik oder Anregungen haben, dann würde ich mich freuen, wenn ihr ein Kommentar hinterlassen würdet.
[amazon_link asins=’3864902908,3836258692,386490451X,3864904838′ template=’ProductCarousel‘ store=’fitnes06-21′ marketplace=’DE‘ link_id=’4ac4e3ac-b4f3-11e8-b249-79c0e9edcccf‘]