默认方法:and
既然是条件判断,就会存在与、或、非三种常见的逻辑关系。其中将两个Preadicate条件使用“与”逻辑连接起来实现“并且”的效果时,可以使用default方法and 。其JDK源码为:
default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) ‐> test(t) && other.test(t); }
逻辑表达式:可以连接多个判断的条件
&&:与运算符,有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 = "abcdef"; //调用checkString方法,参数传递字符串和两个Lambda表达式 boolean b = checkString(s,(String str)->{ //判断字符串的长度是否大于5 return str.length()>5; },(String str)->{ //判断字符串中是否包含a return str.contains("a"); }); System.out.println(b); } }
练习:集合信息筛选
数组当中有多条“姓名+性别”的信息如下,
String[] array = { "迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男", "赵丽颖,女" };
请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,
需要同时满足两个条件:
1. 必须为女生;
2. 姓名为4个字
分析:
1.有两个判断条件,所以需要使用两个Predicate接口,对条件进行判断
2.必须同时满足两个条件,所以可以使用and方法连接两个判断条件
public class Demo05Test { /* 定义一个方法 方法的参数传递一个包含人员信息的数组 传递两个Predicate接口,用于对数组中的信息进行过滤 把满足条件的信息存到ArrayList集合中并返回 */ public static ArrayList<String> filter(String[] arr,Predicate<String> pre1,Predicate<String> pre2){ //定义一个ArrayList集合,存储过滤之后的信息 ArrayList<String> list = new ArrayList<>(); //遍历数组,获取数组中的每一条信息 for (String s : arr) { //使用Predicate接口中的方法test对获取到的字符串进行判断 boolean b = pre1.and(pre2).test(s); //对得到的布尔值进行判断 if(b){ //条件成立,两个条件都满足,把信息存储到ArrayList集合中 list.add(s); } } //把集合返回 return list; } public static void main(String[] args) { //定义一个储存字符串的数组 String[] array = { "迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男", "赵丽颖,女" }; //调用filter方法,传递字符串数组和两个Lambda表达式 ArrayList<String> list = filter(array,(String s)->{ //获取字符串中的性别,判断是否为女 return s.split(",")[1].equals("女"); },(String s)->{ //获取字符串中的姓名,判断长度是否为4个字符 return s.split(",")[0].length()==4; }); //遍历集合 for (String s : list) { System.out.println(s); } } }
publicclassDemo05Test{/* 定义一个方法 方法的参数传递一个包含人员信息的数组 传递两个Predicate接口,用于对数组中的信息进行过滤 把满足条件的信息存到ArrayList集合中并返回 */publicstaticArrayList<String>filter(String[] arr,Predicate<String> pre1,Predicate<String> pre2){//定义一个ArrayList集合,存储过滤之后的信息ArrayList<String> list =newArrayList<>();//遍历数组,获取数组中的每一条信息for(String s : arr){//使用Predicate接口中的方法test对获取到的字符串进行判断boolean b = pre1.and(pre2).test(s);//对得到的布尔值进行判断if(b){//条件成立,两个条件都满足,把信息存储到ArrayList集合中 list.add(s);}}//把集合返回return list;}publicstaticvoidmain(String[] args){//定义一个储存字符串的数组String[] array ={"迪丽热巴,女","古力娜扎,女","马尔扎哈,男","赵丽颖,女"};//调用filter方法,传递字符串数组和两个Lambda表达式ArrayList<String> list =filter(array,(String s)->{//获取字符串中的性别,判断是否为女return s.split(",")[1].equals("女");},(String s)->{//获取字符串中的姓名,判断长度是否为4个字符return s.split(",")[0].length()==4;});//遍历集合for(String s : list){System.out.println(s);}}}