Руководство Java BiPredicate
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
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
Java Basic
- Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
- Программирование на Java для группы с помощью Eclipse и SVN
- Руководство Java WeakReference
- Руководство Java PhantomReference
- Сжатие и декомпрессия в Java
- Настройка Eclipse для использования JDK вместо JRE
- Методы String.format() и printf() в Java
- Синтаксис и новые функции в Java 8
- Регулярные выражения Java
- Руководство Java Multithreading Programming
- Библиотеки Java JDBC Driver для различных типов баз данных
- Руководство Java JDBC
- Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
- Руководство Java Stream
- Руководство Java Functional Interface
- Введение в Raspberry Pi
- Руководство Java Predicate
- Абстрактный класс и Interface в Java
- Модификатор доступа (Access modifiers) в Java
- Руководство Java Enum
- Руководство Java Annotation
- Сравнение и Сортировка в Java
- Руководство Java String, StringBuffer и StringBuilder
- Обработка исключений Java - Java Exception Handling
- Руководство Java Generics
- Манипулирование файлами и каталогами в Java
- Руководство Java BiPredicate
- Руководство Java Consumer
- Руководство Java BiConsumer
- Что мне нужно для начала работы с Java?
- История Java и разница между Oracle JDK и OpenJDK
- Установить Java в Windows
- Установите Java в Ubuntu
- Установите OpenJDK в Ubuntu
- Установить Eclipse
- Установите Eclipse в Ubuntu
- Быстрое изучение Java для начинающих
- История бит и байтов в информатике
- Типы данных в java
- Битовые операции
- Команда if else в Java
- команды switch в Java
- Циклы в Java
- Массивы (Array) в Java
- JDK Javadoc в формате CHM
- Наследование и полиморфизм в Java
- Руководство Java Function
- Руководство Java BiFunction
- Пример Java encoding и decoding с использованием Apache Base64
- Руководство Java Reflection
- Java Удаленный вызов методов - Java RMI
- Руководство Программирование Java Socket
- Какую платформу я должен выбрать для разработки приложений Java Desktop?
- Руководство Java Commons IO
- Руководство Java Commons Email
- Руководство Java Commons Logging
- Понимание Java System.identityHashCode, Object.hashCode и Object.equals
- Руководство Java SoftReference
- Руководство Java Supplier
- Аспектно-ориентированное программирование Java с помощью AspectJ (AOP)
Show More
- Руководства Java Servlet/JSP
- Руководства Java Collections Framework
- Java API для HTML, XML
- Руководства Java IO
- Руководства Java Date Time
- Руководства Spring Boot
- Руководства Maven
- Руководства Gradle
- Руководства Java Web Services
- Руководства Java SWT
- Руководства JavaFX
- Руководства Oracle Java ADF
- Руководства Struts2 Framework
- Руководства Spring Cloud