betacode

Руководство Java BiPredicate

View more Tutorials:

1- BiPredicate

В Java 8, BiPredicate - это functional interface, представляющий оператор, который принимает два входных параметра и возвращает логическое значение boolean.
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);
    }
}
См. Также: Predicate - это functional interrface, аналогичный BiPredicate, который принимает только один параметр:
Например: Создайте объекта BiPredicate, чтобы проверить, соответствует ли длина String заданному числу.
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
Продолжим с приведенным выше примером. Объект Map<String,Integer> содержит сопоставления между String и ее длиной. Однако есть некоторые неправильные сопоставления. Распечатайте правильные сопоставления.
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);
Оцениваем этот BiPredicate по заданным аргументам.

3- BiPredicate + Method reference

Если статический метод принимает 2 параметра и возвращает логическое значение boolean, то его ссылка рассматривается как BiPredicate:
Например:
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()

Метод negate() возвращает новый BiPredicate, оценка которого отрицательна по отношению к текущему BiPredicate.
default BiPredicate<T, U> negate() {
    return (T t, U u) -> !test(t, u);
}
Например: BiPredicate<Integer,Integer>, который проверяет 2 числа, чтобы увидеть, больше ли первое число, чем второе число.
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
Пример: Объект Map<String,Integer> содержит сопоставления между String и ее длиной. Однако есть некоторые неправильные сопоставления. Распечатайте эти неправильные сопоставления.
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)

Метод and(other) создает новый объект BiPredicate путем объединения текущего объекта BiPredicate и other. Он принимает значение true, если как текущий BiPredicate, так и other оцениваются как true.
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);
}
Например:
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)

Метод or(other) возвращает новый объект BiPredicate путем объединения текущего объекта BiPredicate и other. Он оценивается как true, если либо BiPredicate, либо other оценивается как true.
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);
}
Например:
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

View more Tutorials:

Maybe you are interested

Это онлайн курс вне вебсайта o7planning, который мы представляем, он включает бесплатные курсы или курсы со скидкой.