常用的函数式接口_Predicate接口_默认方法and与常用的函数式接口_Predicate接口_默认方法or&negate
常用的函数式接口Predicate接口
默认方法:and;
Predicate既然是条件判断,就会存在与、或、非三种常见的逻辑关系。其中将两个Predicate条件使用“与"逻辑连接起来实现“并且"的效果时,可以使用default方法and。其JDK源码为∶
default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) && other.test(t);
Predicate 通过它可以想到我们学习过逻辑表达式
-
逻辑表达式:可以连接多个判断的条件
-
&&:与运算符,有false则false
-
||:或运算符,有true则true
-
!:非(取反)运算符,非真则假,非假则真.
and方法
package day01.Demo01_Day016; import java.util.function.Predicate; /* 逻辑表达式:可以连接多个判断的条件 &&:与运算符,有false则false ||:或运算符,有true则true !:非(取反)运算符,非真则假,非假则真 需求:判断一个字符串,有两个判断的条件 1.判断字符串的长度是否大于5 2.判断字符串中是否包含a 两个条件必须同时满足,我们就可以使用&&运算符连接两个条件 Predicate接口中有一个方法and,表示并且关系,也可以用于连接两个判断条件 default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> this.test(t) && other.test(t); } 方法内部的两个判断条件,也是使用&&运算符连接起来的 */ public class Demo02Predicate_and { /* 定义一个方法,方法的参数,传递一个字符串 传递两个Predicate接口 一个用于判断字符串的长度是否大于5 一个用于判断字符串中是否包含a 两个条件必须同时满足 */ public static boolean checkString(String s, Predicate<String> pre1,Predicate<String> pre2){ //return pre1.test(s)&&pre2.test(s); return pre1.and(pre2).test(s);//等价于return pre1.test(s) && pre2.test(s); } public static void main(String[] args) { //定义一个字符串 String s ="bcdefa"; //调用checkString方法,参数传递字符串和两个Lambda表达式 boolean b = checkString(s, (String srt)->{ return srt.length()>5; }, (String srt)->{ return srt.contains("a"); }); System.out.println(b); } }
常用的函数式接口 Predicate接口
or方法
其实or 的方法和and方法类似,默认or方法实现逻辑关系中或。jdk源码为
default Predicate<T> or(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) || other.test(t); }
or方法使用
满足一个条件即可,我们就可以使用||运算符连接两个条件
1 package day01.Demo01_Day016; 2 3 import java.util.function.Predicate; 4 5 /* 6 需求:判断一个字符串,有两个判断的条件 7 1.判断字符串的长度是否大于5 8 2.判断字符串中是否包含a 9 满足一个条件即可,我们就可以使用||运算符连接两个条件 10 Predicate接口中有一个方法or,表示或者关系,也可以用于连接两个判断条件 11 default Predicate<T> or(Predicate<? super T> other) { 12 Objects.requireNonNull(other); 13 return (t) -> test(t) || other.test(t); 14 } 15 方法内部的两个判断条件,也是使用||运算符连接起来的 16 */ 17 public class Demo03Predicate_or { 18 /* 19 定义一个方法,方法的参数,传递一个字符串 20 传递两个Predicate接口 21 一个用于判断字符串的长度是否大于5 22 一个用于判断字符串中是否包含a 23 满足一个条件即可 24 */ 25 public static boolean checkString(String s, Predicate<String> pre1,Predicate<String> pre2){ 26 //return pre1.test(s)||pre2.test(s); 27 return pre1.or(pre1).test(s);//等价于//return pre1.test(s)||pre2.test(s); 28 } 29 30 public static void main(String[] args) { 31 //定义一个字符串 32 String s ="abcdyfg"; 33 //调用checkString方法,参数传递字符串和两个Lambda表达式 34 boolean b = checkString(s, 35 (String str)->{ 36 //判断字符串是否大于5; 37 return str.length()>5; 38 }, 39 (String str)->{ 40 return str.contains("a"); 41 }); 42 System.out.println(b); 43 } 44 }
默认方法:negate
当然与”、“或”已经了解了,剩下的“非”(取反)也会简单。默认方法negate 的JDK源代码为:
default Predicate<T> negate() { return (t) -> !test(t); }
从实现中很容易看出,它是执行了test方法之后,对结果boolean值进行“!”取反而已。一定要在test 方法调用之前调用negate 方法,正如and 和or 方法一样:
package day01.Demo01_Day016; import java.util.function.Predicate; /* 需求:判断一个字符串长度是否大于5 如果字符串的长度大于5,那返回false 如果字符串的长度不大于5,那么返回true 所以我们可以使用取反符号!对判断的结果进行取反 Predicate接口中有一个方法negate,也表示取反的意思 default Predicate<T> negate() { return (t) -> !test(t); } */ public class Demo04Predicate_negate { /* 定义一个方法,方法的参数,传递一个字符串 使用Predicate接口判断字符串的长度是否大于5 */ public static boolean checkString(String s, Predicate<String>pre){ //return !pre.test(s); return pre.negate().test(s);//等效于return pre.test(s); } public static void main(String[] args) { //定义一个字符串; String s ="abc"; //调用checkString方法,参数传递字符串和Lambda表达式 boolean b = checkString(s,(String str)->{ //判断字符串的长度是否大于5,并返回结果 return str.length()>5; }); System.out.println(b); } }