淺談Java8新特性Predicate接口
一、前言
Java 8中引入了Predicate
功能接口。
Java Predicate
表示一個(gè)參數(shù)的謂詞。
Predicate
是一個(gè)布爾值的函數(shù)。
Java Predicate
是一個(gè)功能接口,屬于java.util.function
包。
Predicate
的功能方法是test(T t)
。
Predicate
的其他方法是test
、isEqual
、and
、or
、negate
和not
。
not
方法在Java 11中被引入。
在本文章,我們將提供Predicate
的例子及其所有方法。
二、test(T t)
boolean test(T t)
test
是Predicate
的功能方法。它在給定的參數(shù)上評(píng)估這個(gè)謂詞。
例1:
PredicateTestDemo1.java
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)); } } }
輸出結(jié)果
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
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
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; } }
輸出結(jié)果
Hi, You are female and age 20
三、and(Predicate<? super T> other)
default Predicate<T> and(Predicate<? super T> other)
and
是Predicate
的默認(rèn)方法,它返回一個(gè)組成的謂詞,表示這個(gè)謂詞和其他謂詞的短路邏輯AND
。在評(píng)估組成的謂詞時(shí),如果這個(gè)謂詞是假的,那么其他謂詞將不會(huì)被評(píng)估。在錯(cuò)誤的情況下,如果此謂詞拋出錯(cuò)誤,那么其他謂詞將不會(huì)被評(píng)估。
PredicateAndDemo.java
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
四、or(Predicate<? super T> other)
default Predicate<T> or(Predicate<? super T> other)
or
是Predicate
的默認(rèn)方法,它返回一個(gè)組成的謂詞,表示此謂詞和其他謂詞的短路邏輯OR
。在評(píng)估組成的謂詞時(shí),如果此謂詞為真,那么其他謂詞將不會(huì)被評(píng)估。在錯(cuò)誤的情況下,如果此謂詞拋出錯(cuò)誤,那么其他謂詞將不會(huì)被評(píng)估。
PredicateOrDemo.java
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
五、negate()
default Predicate<T> negate()
negate
是Predicate
的默認(rèn)方法,它返回一個(gè)表示該謂詞的邏輯否定的謂詞。如果評(píng)估的結(jié)果是真的,negate
將使它變成假的,如果評(píng)估的結(jié)果是假的,negate
將使它變成真的。
PredicateNegateDemo.java
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
六、isEqual(Object targetRef)
static <T> Predicate<T> isEqual(Object targetRef)
isEqual
是Predicate
的靜態(tài)方法,它返回測(cè)試兩個(gè)參數(shù)是否等于Objects.equals(Object, Object)
的謂詞。我們使用Predicate.isEqual
創(chuàng)建predicate
,如下所示。
Predicate<String> isHelloMsg = Predicate.isEqual("Hello"); Predicate<Book> isMahabharatBook = Predicate.isEqual(new Book("Mahabharat", "Vyas"));
PredicateIsEqualDemo.java
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"))); //false } } 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
七、not(Predicate<? super T> target)
static <T> Predicate<T> not(Predicate<? super T> target)
not
是Java 11
中引入的Predicate
的靜態(tài)方法。
not
返回的predicate
是對(duì)所提供的predicate
的否定。
這是通過(guò)返回調(diào)用target.negate()
的結(jié)果來(lái)完成的。
找到Predicate.not
的例子。
PredicateNotDemo.java
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
在Stream中使用Predicate
我們將提供例子在Stream
中使用Predicate
。
我們將使用Stream.filter
來(lái)過(guò)濾列表。
filter()
的語(yǔ)法如下。
filter(Predicate predicate)
filter()
在處理給定的Predicate
后,返回由過(guò)濾后的數(shù)據(jù)組成的Stream
實(shí)例。
例1:
PredicateStreamDemo1.java
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
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
到此這篇關(guān)于淺談Java8新特性Predicate接口的文章就介紹到這了,更多相關(guān)Java Predicate內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Java的Condition接口最佳理解方式
這篇文章主要介紹了關(guān)于Java的Condition接口最佳理解方式,Condition就是實(shí)現(xiàn)了管程里面的條件變量,Java?語(yǔ)言內(nèi)置的管程里只有一個(gè)條件變量,而Lock&Condition實(shí)現(xiàn)的管程支持多個(gè)條件變量,需要的朋友可以參考下2023-05-05Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解
這篇文章主要介紹了Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組,結(jié)合實(shí)例形式詳細(xì)分析了java的基本概念、定義、迭代、輸出、反轉(zhuǎn)、排序等常用操作技巧,需要的朋友可以參考下2019-08-08MybatisPlus+Postgresql整合的幾個(gè)坑及解決
這篇文章主要介紹了MybatisPlus+Postgresql整合的幾個(gè)坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03SpringBoot中MockMVC單元測(cè)試的實(shí)現(xiàn)
Mock是一種用于模擬和替換類的對(duì)象的方法,以便在單元測(cè)試中獨(dú)立于外部資源進(jìn)行測(cè)試,本文主要介紹了SpringBoot中MockMVC單元測(cè)試的實(shí)現(xiàn),具有應(yīng)該的參考價(jià)值,感興趣的可以了解一下2024-02-02通過(guò)實(shí)例解析JMM和Volatile底層原理
這篇文章主要介紹了通過(guò)實(shí)例解析JMM和Volatile底層原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01JAVA為什么要使用封裝及如何封裝經(jīng)典實(shí)例
這篇文章主要給大家介紹了關(guān)于JAVA為什么要使用封裝及如何封裝的相關(guān)資料,封裝就是將屬性私有化,提供公有的方法訪問(wèn)私有屬性,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10詳解如何使用MyBatis簡(jiǎn)化JDBC開發(fā)
JavaEE?企業(yè)級(jí)?Java?項(xiàng)目中的經(jīng)典三層架構(gòu)為表現(xiàn)層,業(yè)務(wù)層和持久層.MyBatis?對(duì)?JDBC?代碼進(jìn)行了封裝,作為一款優(yōu)秀的持久層框架,專門用于簡(jiǎn)化JDBC開發(fā).本文主要介紹一下如何使用MyBatis簡(jiǎn)化JDBC開發(fā),需要的可以參考一下2023-01-01