Was ist Predicate in Java

Mohammad Irfan 12 Oktober 2023
  1. Was ist Predicate in Java
  2. Predicate in der Filter()-Operation des Java-Streams
Was ist Predicate in Java

Dieses Tutorial stellt die Prädikatschnittstelle mit Beispielen in Java vor.

Das Predicate ist eine Schnittstelle in Java, die als Zielzuweisung für einen Lambda-Ausdruck oder eine Methodenreferenz verwendet wird. Es wurde zu Java 8 hinzugefügt und bot einen funktionaleren Ansatz zum Schreiben von Code in Java.

Es ist im Paket java.util.function enthalten. Ein Predicate wird am häufigsten verwendet, um einen Strom von Objekten zu filtern. In diesem Tutorial werden wir besprechen, was ein Predicate ist und wie wir es verwenden können.

Was ist Predicate in Java

Wie bereits erwähnt, ist ein Predicate eine funktionale Schnittstelle, die als Zuweisungsziel für einen Lambda-Ausdruck oder eine Methodenreferenz verwendet wird. Die Syntax der Predicate-Schnittstelle sieht wie folgt aus.

@FunctionalInterface public interface Predicate<T>

Das T ist der Eingabetyp für die Prädikatschnittstelle. Nehmen wir ein Beispiel dafür, was ein Predicate ist. In der mathematischen Welt kann ein Predicate folgende Form annehmen:

x -> x > 90

Die obige Aussage stellt dar, dass x impliziert, dass x größer als 90 ist.

Sehen wir uns ein Beispiel an, wie wir ein Prädikatobjekt erstellen können.

Predicate<Integer> noGreaterThan5 = x -> x > 5;

Im obigen Code erstellen wir ein Predicate namens noGreaterThan5. Dieses Predicate akzeptiert Integer-Eingaben; daher ist T hier Integer. Dieses Predicate prüft, ob die Eingabeargumente größer als fünf sind oder nicht.

Predicate in der Filter()-Operation des Java-Streams

Die Operation filter() der Java-8-Stream-API verwendet ein Predicate als Argument. Im folgenden Code verwenden wir die Operation filter(), um die Implementierung der Prädikatschnittstelle anzuzeigen. Sehen Sie sich den folgenden Code an:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameGreaterThan4 = x -> x.length() > 4;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameGreaterThan4).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

Ausgabe:

[Karan, Aarya, Rahul, Pranav]

Wir haben den obigen Code geschrieben, um Namen zu filtern, deren Länge größer als 4 ist. Wir erstellen zuerst ein Predicate und eine Liste, um die Namen zu speichern.

Dann erstellen wir mit der Methode List.toStream() einen Strom von Namen und wenden die Operation filter() an. Die Filteroperation nimmt das Predicate nameGreaterThan4 als Argument.

Die Filteroperation, die dieses Predicate verwendet, ließ nur die Zeichenketten zu, deren Länge größer als 4 war. Die Zeichenketten, die mit dem Predicate übereinstimmten, wurden schließlich von der Erfassungsoperation gesammelt und in einer Liste gespeichert.

Anstatt Prädikatobjekte separat zu erstellen, können wir das Predicate direkt an die Filterfunktion übergeben. Sehen Sie sich den folgenden Code an:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(x -> x.length() > 4).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

Ausgabe:

[Karan, Aarya, Rahul, Pranav]

Predicate.and()-Methode in Java

Wir können die Methode Predicate.and() verwenden, um zwei Prädikate auf die Filteroperation anzuwenden. Es gibt ein zusammengesetztes Predicate zurück, das ein logisches AND dieses widerspiegelt und ein anderes Predicate kurzschließt.

Wenn dieses Predicate bei der Auswertung des zusammengesetzten Prädikats false ist, wird das andere Predicate nicht ausgewertet. Die Methodensignatur dieser Methode lautet:

default Predicate<T> and(Predicate<? super T> other)

Andere im Argument bezieht sich auf das zweite Prädikat, das wir vielleicht anwenden möchten. Sehen wir uns nun einige Beispiele an, um mehr über diese Methode zu erfahren. Sehen Sie sich den folgenden Code an:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameGreaterThan3 = x -> x.length() > 3;
    Predicate<String> nameLesserThan5 = x -> x.length() < 5;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameGreaterThan3.and(nameLesserThan5)).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

Ausgabe:

[Alok]

Im obigen Code prüft das erste Prädikat, ob die Stringlänge größer als 3 ist, und das zweite, ob die Stringlänge kleiner als 5 ist filtert Namen, deren Länge gleich 4 ist.

Der obige Code kann wie folgt prägnanter geschrieben werden:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(x -> x.length() > 3 && x.length() < 5).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

Ausgabe:

[Alok]

Predicate.or()-Methode in Java

Wie in der vorherigen Diskussion haben wir die AND-Operation mit der and()-Methode angewendet. Wir können die OR-Operation auch mit der or()-Methode anwenden.

Es gibt ein zusammengesetztes Predicate zurück, das ein logisches ODER dieses und eines anderen kurzschließenden Prädikats widerspiegelt. Wenn dieses Predicate true ist, wird das andere Predicate bei der Bewertung des zusammengesetzten Prädikats nicht berücksichtigt.

Die Methodensignatur dieser Methode lautet:

default Predicate<T> or(Predicate<? super T> other)

Andere im Argument bezieht sich auf das zweite Prädikat, das wir vielleicht anwenden möchten. Sehen wir uns nun einige Beispiele an, um mehr über diese Methode zu erfahren. Sehen Sie sich den folgenden Code an:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameEqualTo3 = x -> x.length() == 3;
    Predicate<String> nameEqualTo2 = x -> x.length() == 2;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameEqualTo3.or(nameEqualTo2)).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

Ausgabe:

[Ram, Om]

Im obigen Code prüft das erste Prädikat, ob die Zeichenkettenlänge gleich 3 ist, und das zweite Prädikat, ob die Zeichenkettenlänge gleich 5 ist. Wenn diese beiden Prädikate mit der Operation OR an die Filteroperation übergeben werden, ist dies der Fall filtert Namen, deren Länge gleich 3 oder 2 ist.

Der obige Code kann wie folgt prägnanter geschrieben werden:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // Create a list
    List<String> je_name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> je_name_filtered = je_name.stream()
                                        .filter(x -> x.length() == 3 || x.length() == 2)
                                        .collect(Collectors.toList());
    // print the resulting list
    System.out.println(je_name_filtered);
  }
}

Ausgabe:

[Ram, Om]

Verwandter Artikel - Java Interface