Predicate
函数式接口是在 Java 8 中引入。Java Predicate
表示一个参数的Predicate接口。 Predicate
是一个布尔值函数。 Java Predicate
是一个函数式接口,属于 java.util.function
包。 Predicate
的函数方法是test(T t)
。 Predicate
的其他方法是 test
、isEqual
、and
、or
、negate
和 not
。 Java 11 中引入了 not
方法。在本文中,我们将提供 Predicate
及其所有方法的示例。
boolean test(T t)
test
是 Predicate
的函数方法。它根据给定的参数评估这个Predicate接口。
示例 1:
PredicateTestDemo1.java
package com.concretepage;
import java.util.function.Predicate;
public class PredicateTestDemo1 {
public static void main(String[] args) {
// Is username valid
Predicate<String> isUserNameValid = u -> u != null && u.length() > 5 && u.length() < 10;
System.out.println(isUserNameValid.test("Mahesh")); //true
// Is password valid
Predicate<String> isPasswordValid = p -> p != null && p.length() > 8 && p.length() < 15;
System.out.println(isPasswordValid.test("Mahesh123")); //true
// Word match
Predicate<String> isWordMatched = s -> s.startsWith("Mr.");
System.out.println(isWordMatched.test("Mr. Mahesh")); //true
//Odd numbers
Predicate<Integer> isEven = n -> n % 2 == 0;
for(int i = 0 ; i < 5 ; i++) {
System.out.println("Is "+ i + " even: " + isEven.test(i));
}
}
}
输出
true
true
true
Is 0 even: true
Is 1 even: false
Is 2 even: true
Is 3 even: false
Is 4 even: true
示例 2:
PredicateTestDemo2.java
package com.concretepage;
import java.util.function.Function;
import java.util.function.Predicate;
public class PredicateTestDemo2 {
public static void main(String[] args){
Predicate<Student> maleStudent = s-> s.getAge() >= 20 && "male".equals(s.getGender());
Predicate<Student> femaleStudent = s-> s.getAge() > 18 && "female".equals(s.getGender());
Function<Student,String> maleStyle = s-> "Hi, You are male and age "+s.getAge();
Function<Student,String> femaleStyle = s-> "Hi, You are female and age "+ s.getAge();
Student s1 = new Student("Gauri", 20,"female");
if(maleStudent.test(s1)){
System.out.println(s1.customShow(maleStyle));
}else if(femaleStudent.test(s1)){
System.out.println(s1.customShow(femaleStyle));
}
}
}
Student.java
package com.concretepage;
import java.util.function.Function;
public class Student {
private String name;
private int age;
private String gender;
private int marks;
public Student(String name, int age, String gender){
this.name = name;
this.age = age;
this.gender = gender;
}
public Student(String name, int age, String gender, int marks){
this.name = name;
this.age = age;
this.gender = gender;
this.marks = marks;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
public int getMarks() {
return marks;
}
public String customShow(Function<Student,String> fun){
return fun.apply(this);
}
public String toString(){
return name+" - "+ age +" - "+ gender + " - "+ marks;
}
}
输出
Hi, You are female and age 20
default Predicate<T> and(Predicate<? super T> other)
and
是 Predicate
的默认方法,它返回一个组合Predicate接口,该Predicate接口表示该Predicate接口与另一个Predicate接口的短路逻辑与。在评估组合Predicate接口时,如果此Predicate接口是 false
,则不会评估其他Predicate接口。如果发生错误,如果此Predicate接口抛出错误,则不会评估其他Predicate接口。
PredicateAndDemo.java
package com.concretepage;
import java.util.function.Predicate;
public class PredicateAndDemo {
public static void main(String[] args) {
Predicate<Student> isMaleStudent = s -> s.getAge() >= 20 && "male".equals(s.getGender());
Predicate<Student> isFemaleStudent = s -> s.getAge() > 18 && "female".equals(s.getGender());
Predicate<Student> isStudentPassed = s -> s.getMarks() >= 33;
// Testing if male student passed.
Student student1 = new Student("Mahesh", 22, "male", 30);
Boolean result = isMaleStudent.and(isStudentPassed).test(student1);
System.out.println(result); //false
// Testing if female student passed.
Student student2 = new Student("Gauri", 19, "female", 40);
result = isFemaleStudent.and(isStudentPassed).test(student2);
System.out.println(result); //true
}
}
输出
false
true
default Predicate<T> or(Predicate<? super T> other)
or
是 Predicate
的默认方法,它返回一个组合Predicate接口,该Predicate接口表示该Predicate接口和另一个Predicate接口的短路逻辑 OR。在评估组合Predicate接口时,如果此Predicate接口是 true
,则不会评估其他Predicate接口。如果发生错误,如果此Predicate接口抛出错误,则不会评估其他Predicate接口。
PredicateOrDemo.java
package com.concretepage;
import java.util.function.Predicate;
public class PredicateOrDemo {
public static void main(String[] args) {
Predicate<Student> isMaleStudent = s -> s.getAge() >= 20 && "male".equals(s.getGender());
Predicate<Student> isFemaleStudent = s -> s.getAge() > 18 && "female".equals(s.getGender());
Predicate<Student> isStudentPassed = s -> s.getMarks() >= 33;
Student student1 = new Student("Mahesh", 22, "male", 35);
//Test either male or female student
Boolean result = isMaleStudent.or(isFemaleStudent).test(student1);
System.out.println(result); //true
//Is student passed, too
result = isMaleStudent.or(isFemaleStudent).and(isStudentPassed).test(student1);
System.out.println(result); //true
}
}
输出
true
true
default Predicate<T> negate()
negate
是 Predicate
的默认方法,它返回一个表示该Predicate接口的逻辑否定的Predicate接口。如果评估结果为 true
,则 negate
将变为 false
,如果评估结果为 false
,则 negate
将变为 true
。
PredicateNegateDemo.java
package com.concretepage;
import java.util.function.Predicate;
public class PredicateNegateDemo {
public static void main(String[] args) {
Predicate<Integer> isNumberMatched = n -> n > 10 && n < 20;
//With negate()
Boolean result = isNumberMatched.negate().test(15);
System.out.println(result); //false
//Without negate()
result = isNumberMatched.test(15);
System.out.println(result); //true
Predicate<String> isValidName = s -> s.length() > 5 && s.length() < 15;
System.out.println(isValidName.negate().test("Krishna")); //false
Predicate<Integer> isLessThan50 = n -> n < 50;
System.out.println(isLessThan50.negate().test(60)); //true
Predicate<Integer> isGreaterThan20 = n -> n > 20;
System.out.println(isGreaterThan20.negate().test(30)); //false
result = isLessThan50.and(isGreaterThan20).negate().test(25);
System.out.println(result); //false
}
}
输出
false
true
false
true
false
false
static <T> Predicate<T> isEqual(Object targetRef)
isEqual
是 Predicate
的静态方法,它返回根据 Objects.equals(Object, Object)
测试两个参数是否相等的Predicate接口。我们使用 Predicate.isEqual
创建Predicate接口,如下所示。
Predicate<String> isHelloMsg = Predicate.isEqual("Hello");
Predicate<Book> isMahabharatBook = Predicate.isEqual(new Book("Mahabharat", "Vyas"));
例子如下:
PredicateIsEqualDemo.java
package com.concretepage;
import java.util.function.Predicate;
public class PredicateIsEqualDemo {
public static void main(String[] args) {
System.out.println("---Testing Hello message---");
Predicate<String> isHelloMsg = Predicate.isEqual("Hello");
System.out.println(isHelloMsg.test("Hello")); //true
System.out.println(isHelloMsg.test("Hi")); //false
System.out.println("---Testing Mahabharat book---");
Book mahabharatBook = new Book("Mahabharat", "Vyas");
Predicate<Book> isMahabharatBook = Predicate.isEqual(mahabharatBook);
System.out.println(isMahabharatBook.test(new Book("Mahabharat", "Vyas"))); //true
System.out.println(isMahabharatBook.test(new Book("Ramayan", "Valmiki"))); //true
}
}
class Book {
private String name;
private String writer;
public Book(String name, String writer) {
this.name = name;
this.writer = writer;
}
public String getName() {
return name;
}
public String getWriter() {
return writer;
}
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
final Book b = (Book) obj;
if (this == b) {
return true;
} else {
return (this.name.equals(b.name) && (this.writer == b.writer));
}
}
}
输出
---Testing Hello message---
true
false
---Testing Mahabharat book---
true
false
static <T> Predicate<T> not(Predicate<? super T> target)
not
是 Java 11 中引入的 Predicate
的静态方法。 not
返回Predicate接口,即提供的Predicate接口的否定。这是通过返回调用 target.negate()
的结果来完成的。找到 Predicate.not
的例子。
PredicateNotDemo.java
package com.concretepage;
import java.util.function.Predicate;
public class PredicateNotDemo {
public static void main(String[] args) {
Predicate<Integer> isOdd = n -> n % 2 == 1;
Predicate<Integer> isEven = Predicate.not(isOdd);
System.out.println(isEven.test(10)); //true
Predicate<String> isNotHelloMsg = Predicate.not(Predicate.isEqual("Hello"));
System.out.println(isNotHelloMsg.test("Hi")); //true
System.out.println(isNotHelloMsg.test("Hello")); //false
}
}
输出
true
true
false
我们将提供使用 Predicate
和 Stream
的示例。我们将使用 Stream.filter
过滤列表。 filter()
的语法如下。
filter(Predicate predicate)
filter()
返回 Stream
的实例,该实例包含处理给定 Predicate
后的过滤数据。
示例 1:
PredicateStreamDemo1.java
package com.concretepage;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class PredicateStreamDemo1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Vijay");
list.add("Ramesh");
list.add("Mahesh");
Predicate<String> isNameEndsWithSh = s -> s.endsWith("sh");
list.stream().filter(isNameEndsWithSh)
.forEach(s -> System.out.println(s));
}
}
输出
Ramesh
Mahesh
示例 2:
PredicateStreamDemo2.java
package com.concretepage;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class PredicateStreamDemo2 {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("Mahesh", 20, "male", 38));
list.add(new Student("Gauri", 21, "female", 45));
list.add(new Student("Krishna", 19, "male", 42));
list.add(new Student("Radha", 20, "female", 35));
System.out.println("--- All students scoring marks > 40 ---");
Predicate<Student> isScoreGt40 = std -> std.getMarks() > 40;
filterStudent(isScoreGt40, list).forEach(s -> System.out.println(s));
System.out.println("--- All Male Students ---");
Predicate<Student> isMaleStudent = std -> "male".equals(std.getGender());
filterStudent(isMaleStudent, list).forEach(s -> System.out.println(s));
System.out.println("--- All Female Students ---");
Predicate<Student> isFemaleStudent = std -> "female".equals(std.getGender());
filterStudent(isFemaleStudent, list).forEach(s -> System.out.println(s));
System.out.println("--- All Female Students scoring > 40 ---");
filterStudent(isFemaleStudent.and(isScoreGt40), list).forEach(s -> System.out.println(s));
}
static List<Student> filterStudent(Predicate<Student> predicate, List<Student> list) {
return list.stream().filter(predicate).collect(Collectors.toList());
}
}
输出
--- All students scoring marks > 40 ---
Gauri - 21 - female - 45
Krishna - 19 - male - 42
--- All Male Students ---
Mahesh - 20 - male - 38
Krishna - 19 - male - 42
--- All Female Students ---
Gauri - 21 - female - 45
Radha - 20 - female - 35
--- All Female Students scoring > 40 ---
Gauri - 21 - female - 45
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.concretepage.com/java/java-8/java-predicate
内容来源于网络,如有侵权,请联系作者删除!