Übereinstimmungen in einem Stream-Filter zählen

1. Übersicht

In diesem Tutorial werden wir die Verwendung der Stream.count () -Methode untersuchen. Insbesondere werden wir sehen, wie wir die count () -Methode mit der filter () -Methode kombinieren können, um die Übereinstimmungen eines von uns angewendeten Prädikats zu zählen .

2. Verwenden von Stream.count ()

Die count () -Methode selbst bietet eine kleine, aber sehr nützliche Funktionalität. Wir können es auch hervorragend mit anderen Tools kombinieren, zum Beispiel mit Stream.filter () .

Lassen Sie uns verwenden den gleichen Kunden - Klasse, die wir in unserem Tutorial definiert für Stream.filter () :

public class Customer { private String name; private int points; //Constructor and standard getters }

Darüber hinaus erstellen wir dieselbe Kundenkollektion:

Customer john = new Customer("John P.", 15); Customer sarah = new Customer("Sarah M.", 200); Customer charles = new Customer("Charles B.", 150); Customer mary = new Customer("Mary T.", 1); List customers = Arrays.asList(john, sarah, charles, mary);

Als Nächstes wenden wir Stream- Methoden auf die Liste an, um sie zu filtern und zu bestimmen, wie viele Übereinstimmungen unsere Filter erhalten.

2.1. Elemente zählen

Sehen wir uns die grundlegende Verwendung von count () an :

long count = customers.stream().count(); assertThat(count).isEqualTo(4L);

Beachten Sie, dass count () einen langen Wert zurückgibt .

2.2. Verwenden von count () Mit filter ()

Das Beispiel im vorherigen Unterabschnitt war nicht wirklich beeindruckend. Wir hätten mit der List.size () -Methode zum gleichen Ergebnis kommen können .

Stream.count () glänzt wirklich, wenn wir es mit anderen Stream- Methoden kombinieren - meistens mit filter () :

long countBigCustomers = customers .stream() .filter(c -> c.getPoints() > 100) .count(); assertThat(countBigCustomers).isEqualTo(2L);

In diesem Beispiel haben wir einen Filter auf die Kundenliste angewendet und auch die Anzahl der Kunden ermittelt, die die Bedingung erfüllen. In diesem Fall haben wir zwei Kunden mit mehr als 100 Punkten.

Natürlich kann es auch vorkommen, dass kein Element zu unserem Filter passt:

long count = customers .stream() .filter(c -> c.getPoints() > 500) .count(); assertThat(count).isEqualTo(0L); 

2.3. Verwenden von count () mit erweiterten Filtern

In unserem Tutorial zu filter () haben wir einige fortgeschrittenere Anwendungsfälle der Methode gesehen. Natürlich können wir das Ergebnis solcher filter () - Operationen immer noch zählen .

Wir können Sammlungen nach mehreren Kriterien filtern:

long count = customers .stream() .filter(c -> c.getPoints() > 10 && c.getName().startsWith("Charles")) .count(); assertThat(count).isEqualTo(1L);

Hier haben wir die Anzahl der Kunden gefiltert und gezählt, deren Namen mit „Charles“ beginnen und die mehr als 10 Punkte haben.

Wir können die Kriterien auch in eine eigene Methode extrahieren und die Methodenreferenz verwenden:

long count = customers .stream() .filter(Customer::hasOverHundredPoints) .count(); assertThat(count).isEqualTo(2L);

3. Fazit

In diesem Artikel haben wir einige Beispiele für die Verwendung der count () -Methode in Kombination mit der filter () -Methode zum Verarbeiten von Streams gesehen. Weitere Anwendungsfälle von count () finden Sie in anderen Methoden, die einen Stream zurückgeben , z. B. in unserem Lernprogramm zum Zusammenführen von Streams mit concat () .

Wie immer ist der vollständige Code auf GitHub verfügbar.