codestory

Die Anleitung zu Java BiPredicate

  1. BiPredicate
  2. test(T t, U u)
  3. BiPredicate + Method reference
  4. negate()
  5. and(BiPredicate other)
  6. or(BiPredicate other)

1. BiPredicate

Im Java 8 ist BiPredicate eine functional interface, die einen Operator darstellt, der zwei Eingabeparameter akzeptiert und einen Wert boolean zurückgibt.
BiPredicate interface
@FunctionalInterface
public interface BiPredicate<T, U> {
    boolean test(T t, U u);
    
    default BiPredicate<T, U> and(BiPredicate<? super T, ? super U> other) {
        Objects.requireNonNull(other);
        return (T t, U u) -> test(t, u) && other.test(t, u);
    }  
    default BiPredicate<T, U> negate() {
        return (T t, U u) -> !test(t, u);
    }
    default BiPredicate<T, U> or(BiPredicate<? super T, ? super U> other) {
        Objects.requireNonNull(other);
        return (T t, U u) -> test(t, u) || other.test(t, u);
    }
}
Sehen Sie mehr: Predicate ist eine functional interrface ähnlich wie BiPredicate, die nur einen Parameter akzeptiert:
Zum Beispiel: Erstellen Sie ein Objekt BiPredicate um zu überprüfen, ob die Länge eines String mit einer bestimmten Zahl übereinstimmt.
BiPredicateEx1.java
package org.o7planning.bipredicate.ex;

import java.util.function.BiPredicate;

public class BiPredicateEx1 {

    public static void main(String[] args) {  
        // Create a BiPredicate.
        BiPredicate<String,Integer> tester = (aString, aNumber) -> {
            return aString.length() == aNumber;
        };
        // Test:
        boolean testResult = tester.test("o7planning.org", 14);
        
        System.out.println("Test Result: " + testResult);
    }
}
Output:
Test Result: true
Gehen Sie mit dem obigen Beispiel weiter. Ein Objekt Map<String,Integer> enthält die Mappings zwischen einem String und seiner Länge. Es gibt jedoch einige falsche Mapping. Drucken Sie die richtigen Mapping aus.
BiPredicateEx2.java
package org.o7planning.bipredicate.ex;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiPredicate;

public class BiPredicateEx2 {

    public static void main(String[] args) {  
        // Create a BiPredicate.
        BiPredicate<String,Integer> tester = (aString, aNumber) -> {
            return aString.length() == aNumber;
        };

        // String aString --> Integer length.
        Map<String,Integer> map = new HashMap<String,Integer>();
        
        map.put("Apple", 5);
        map.put("Google", 10); // Wrong
        map.put("Microsoft", 9);
        map.put("Amazon", 100); // Wrong
        map.put("Louis Vuitton", 13);  
        map.put("Disney", 6);  
        map.put("Intel", 5);  
        
        map.entrySet()  // Set<Map.Entry<String,Integer>>
             .stream()  // Stream<Map.Entry<String,Integer>>
             // filter(Predicate<Map.Entry<String,Integer>>)
             .filter(entry ->  tester.test(entry.getKey(), entry.getValue())) // Stream<Map.Entry<String,Integer>>
             .forEach(entry -> System.out.println(entry.getKey() +" --> " + entry.getValue()));
    }
}
Output:
Apple --> 5
Disney --> 6
Louis Vuitton --> 13
Microsoft --> 9
Intel --> 5

2. test(T t, U u)

public boolean test(T t, U u);
Bewertet dieses BiPredicate anhand der angegebenen Argumente.

3. BiPredicate + Method reference

Wenn eine statische Methode zwei Parameter verwendet und einen Wert boolean zurückgibt, wird ihre Referenz als BiPredicate betrachtet:
Zum Beispiel:
BiPredicate_mRef_ex1.java
package org.o7planning.bipredicate.ex;

import java.util.function.BiPredicate;

public class BiPredicate_mRef_ex1 {

    public static void main(String[] args) {
        // Create a BiPredicate from a Method reference.
        BiPredicate<Staff,Integer> tester = StaffUtils::higher;
        
        Staff tom = new Staff("Tom", 3000);
        
        boolean testResult = tester.test(tom, 2000);
        
        System.out.println("Test Result: " + testResult);
    }
}

class StaffUtils {

    // A static method take 2 input parameters and return boolean type.
    public static boolean higher(Staff staff, int salary) {
         return staff.getSalary() > salary;
    }
}

class Staff {
    private String fullName;
    private int salary;
    
    public Staff(String fullName, int salary) {
        this.fullName = fullName;
        this.salary = salary;
    }
    public String getFullName() {
        return fullName;
    }
    public int getSalary() {
        return salary;
    }
}
Output:
Test Result: true

4. negate()

Die Methode negate() gibt ein neues Objekt BiPredicate zurück, dessen Auswertung des aktuellen BiPredicate negativ ist.
default BiPredicate<T, U> negate() {
    return (T t, U u) -> !test(t, u);
}
Beispiel: Ein BiPredicate<Integer,Integer>, das 2 Zahlen überprüft, um festzustellen, ob die erste Zahl größer als die zweite Zahl ist.
BiPredicate_negate_ex1.java
package org.o7planning.bipredicate.ex;

import java.util.function.BiPredicate;

public class BiPredicate_negate_ex1 {

    public static void main(String[] args) {  
        // Create a BiPredicate.
        // Check if anInteger1 > anInteger2
        BiPredicate<Integer, Integer> tester = (anInteger1, anInteger2) -> {
            return anInteger1 > anInteger2;
        };
      
        boolean test1 = tester.test(100, 10);
        
        boolean test2 = tester.negate().test(100, 10);
   
        System.out.println("Test1: " + test1);
        System.out.println("Test2: " + test2);
    }
}
Output:
Test1: true
Test2: false
Beispiel: Ein Objekt Map<String,Integer> enthält die Mappings zwischen einem String und seiner Länge. Es gibt jedoch einige falsche Mappings. Drucken Sie diese falschen Mapping aus.
BiPredicate_negate_ex2.java
package org.o7planning.bipredicate.ex;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiPredicate;

public class BiPredicate_negate_ex2 {

    public static void main(String[] args) {  
        // Create a BiPredicate.
        // Check if length of a String equals to aNumber.
        BiPredicate<String,Integer> tester = (aString, aNumber) -> {
            return aString.length() == aNumber;
        };

        // String aString --> Integer length.
        Map<String,Integer> map = new HashMap<String,Integer>();
        
        map.put("Apple", 5);
        map.put("Google", 10); // Wrong
        map.put("Microsoft", 9);
        map.put("Amazon", 100); // Wrong
        map.put("Louis Vuitton", 13);  
        map.put("Disney", 6);  
        map.put("Intel", 5);  
        
        map.entrySet()  // Set<Map.Entry<String,Integer>>
             .stream()  // Stream<Map.Entry<String,Integer>>
             // filter(Predicate<Map.Entry<String,Integer>>)
             .filter(entry ->  tester.negate().test(entry.getKey(), entry.getValue())) // Stream<Map.Entry<String,Integer>>
             .forEach(entry -> System.out.println(entry.getKey() +" --> " + entry.getValue()));
    }
}
Output:
Google --> 10
Amazon --> 100

5. and(BiPredicate other)

Die Methode and(other) erstellt ein neues Objekt BiPredicate , indem das aktuelle Objekt BiPredicate und other kombiniert werden. Es wird als true ausgewertet wenn sowohl das aktuelle BiPredicate als auch other als true bewertet werden.
default BiPredicate<T, U> and(BiPredicate<? super T, ? super U> other) {
    Objects.requireNonNull(other);
    return (T t, U u) -> test(t, u) && other.test(t, u);
}
Zum Beispiel:
BiPredicate_and_ex1.java
package org.o7planning.bipredicate.ex;

import java.util.function.BiPredicate;

public class BiPredicate_and_ex1 {

    public static void main(String[] args) {
        // Test if anInteger1 > anInteger2
        BiPredicate<Integer, Integer> tester1 = (anInteger1, anInteger2) -> {
            return anInteger1 > anInteger2;
        };

        // Test if anInteger1 + anInteger2 > 100
        BiPredicate<Integer, Integer> tester2 = (anInteger1, anInteger2) -> {
            return anInteger1 + anInteger2 > 100;
        };

        // Test if number1 > number2 and number1 + number2 > 100.
        boolean testResult1 = tester1.and(tester2).test(70, 45);
        boolean testResult2 = tester1.and(tester2).test(45, 70);
        
        System.out.println("Test Result 1: " + testResult1);
        System.out.println("Test Result 2: " + testResult2);
    }
}
Output:
Test Result 1: true
Test Result 2: false

6. or(BiPredicate other)

Die Methode or(other) gibt ein neues Objekt BiPredicate zurück, indem das aktuelle BiPredicate und other kombiniert werden. Es wird als true ausgewertet, wenn entweder das aktuelle BiPredicate oder ein anderes als true bewertet wird.
default BiPredicate<T, U> or(BiPredicate<? super T, ? super U> other) {
    Objects.requireNonNull(other);
    return (T t, U u) -> test(t, u) || other.test(t, u);
}
Zum Beispiel:
BiPredicate_or_ex1.java
package org.o7planning.bipredicate.ex;

import java.util.function.BiPredicate;

public class BiPredicate_or_ex1 {

    public static void main(String[] args) {
        // Test if anInteger1 > anInteger2
        BiPredicate<Integer, Integer> tester1 = (anInteger1, anInteger2) -> {
            return anInteger1 > anInteger2;
        };

        // Test if anInteger1 + anInteger2 > 100
        BiPredicate<Integer, Integer> tester2 = (anInteger1, anInteger2) -> {
            return anInteger1 + anInteger2 > 100;
        };

        // Test if number1 > number2 or number1 + number2 > 100.
        boolean testResult1 = tester1.or(tester2).test(70, 45);
        boolean testResult2 = tester1.or(tester2).test(45, 70);  
        
        System.out.println("Test Result 1: " + testResult1);
        System.out.println("Test Result 2: " + testResult2);
    }
}
Output:
Test Result 1: true
Test Result 2: true

Java Grundlagen

Show More