常用函数式接口_Predicate
Java8在java.util.function包下预定义了大量的函数式接口供我们使用
我们重点来学习下面的4个接口:
1、Supplier接口
2、Consumer接口
3、Predicate接口
4、Function接口
Predicate,断定型接口
Predicate接口在java.util.function包下。该接口有一个泛型,即我们看到的
该接口里面有4个方法,分别是与and、或or、非not、test。如下。注意下面的'Predicate<? super T>‘指的是函数式接口
返回值类型 | 方法 | 作用 |
---|---|---|
boolean | test(T t) | 根据给定的参数计算此谓词 |
default Predicate | and(Predicate<? super T> other) | 返回一个组合判断,表示短路逻辑的与 |
default Predicate | or(Predicate<? super T> other) | 返回一个组合判断,表示短路逻辑的或 |
static | not(Predicate<? super T> target) | 返回一个逻辑的否定,表示逻辑非 |
default Predicate | negate() | 返回一个逻辑的否定,表示逻辑非 |
static | isEqual(Object targetRef) | 返回一个谓词,根据Objects.equals(Object, Object)测试两个参数是否相等 |
常用函数式接口_Predicate的test和negate方法练习
xxxxxxxxxx
package ch25;
import java.util.function.Predicate;
public class a_8_1测试 {
public static void main(String[] args) {
//使用Lambda表达式的方式来调用最下面的checkString方法
boolean b1 = checkString("hello1",(String s)->{ //第二个参数是函数式接口,即第二个参数可以用Lambda表达式来代替
//上面那行的checkString的方法是有返回值的,使用boolean类型的b1来接收一下
return s.length()>8;//判断字符串长度是否大于8
});
System.out.println(b1);
//上面的Lambda表达式可以使用省略模式优化一下,如下
boolean b11 = checkString("hello11",s-> s.length()>5);
System.out.println(b11);
System.out.println("-------下面那行跟上面那行判断相反--------");
//上面那些是演示Predicate接口的test方法
//------------------------------------------------------------------------------------------------------
//下面那些是演示Predicate接口的!test方法
boolean b2 = checkString2("hello11",s-> s.length()>5);
System.out.println(b2);
System.out.println("---------------");
}
//--------------------------------------------------------------------------------------------------------------
//定义一个方法,用于判断给定的字符串是否满足要求
private static boolean checkString(String s, Predicate<String> pre){
return pre.test(s);//具体的判断逻辑的代码由Lambda表达式来实现
}
//定义一个方法,用于判断给定的字符串是否不满足要求
private static boolean checkString2(String s, Predicate<String> pre){
//return !pre.test(s);//对结果进行一个逻辑非的判断
//上面那行的写法虽然也可以,但是我们Predicate接口有一个逻辑非方法,如下
return pre.negate().test(s);//对test(s)进行逻辑非(negate)的操作。选中negate按Ctrl+B查看源码,会发现negate方法的底层其实就是上面那一行的!test
}
}
常用函数式接口_Predicate的and和or方法练习
xxxxxxxxxx
package ch25;
import java.util.function.Predicate;
public class a_9_1测试 {
public static void main(String[] args) {
boolean b1 = checkString("hello",s->s.length()>8);
System.out.println(b1);
boolean b2 = checkString("helloworld",s->s.length()>8);
System.out.println(b2);
System.out.println("----------------");
//上面那些是上节课的
//------------------------------------------------------------------------------
//下面的是逻辑与,包括底层写法和Predicate接口提供的and方法
//调用最下面的checkString2方法
boolean b3 = checkString2("hello",s->s.length()>8,s->s.length()<15);
System.out.println(b3);//上面的第二个参数返回的是false,第上参数返回的是true,在再将false和true做逻辑与运算,结果是false
//调用优化对checkString2方法优化后的checkString3方法,如下
boolean b33 = checkString3("hello",s->s.length()>8,s->s.length()<15);
System.out.println(b33);//效果跟上面那行调用checkString2方法是一样的
System.out.println("----------------");
//-------------------------------------------------------------------------------
//下面的是逻辑或,只使用Predicate接口提供的or方法
//调用最下面的checkString4方法
boolean b4 = checkString4("hello",s->s.length()>8,s->s.length()<15);
System.out.println(b4);//效果跟上面那行调用checkString2方法是一样的
}
//--------------------------------------------------------------------------------------------------------------
//定义一个方法,用于判断给定的字符串是否满足要求
private static boolean checkString(String s, Predicate<String> pre){
return pre.test(s);//这个test方法是上节课讲的
}
//定义一个方法,用于同一个字符串给出两个不同的判断条件,最后把这两个判断的结果再去做逻辑与判断之后的结果作为最终的结果
//也就是这次的方法需要两个Predicate接口作为这次方法的参数
private static boolean checkString2(String s,Predicate<String> pre1,Predicate<String> pre2){
boolean b1 = pre1.test(s);
boolean b2 = pre2.test(s);
boolean b = b1 && b2;//b用来做逻辑与运算
return b;//b才是最终结果
}
//上面那个checkString2太麻烦了,Predicate其实就已经提供了一个逻辑与的方法,即and(),如下
private static boolean checkString3(String s,Predicate<String> pre1,Predicate<String> pre2){
return pre1.and(pre2).test(s);//效果跟checkString2方法是一样的
//选中上面那行的and,按Ctrl+B查看源码,会发现and方法的底层其实就是checkString2方法的&&。都为真就为真
}
//跟逻辑与and对应的方法是逻辑或or,如下
private static boolean checkString4(String s,Predicate<String> pre1,Predicate<String> pre2){
return pre1.or(pre2).test(s);//效果跟checkString2方法是一样的
//选中上面那行的or,按Ctrl+B查看源码,会发现or方法的底层是短路逻辑运算符||。一个为真就为真
}
}
Predicate接口_筛选数据
练习: 1、String[] strArray={"张老三,16","李老四,17","王老五,20","小明,19","小红,18"}; 2、字符串数组中有多条信息,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,并遍历ArrayList集合 3、同时满足如下要求:姓名长度大于2,年龄大于18
分析: 1、有两个判断条件,所以需要使用两个Predicate接口,对条件进行判断 2、必须同时满足两个条件,所以可以使用and方法连接两个判断条件
Predicate接口_筛选数据的练习
xxxxxxxxxx
package ch25;
import java.util.ArrayList;
import java.util.function.Predicate;
public class a_10_1测试 {
public static void main(String[] args) {
//定义字符串数组
String[] strArray = {"张老三,16", "李老四,17", "王老五,20", "小明,19", "小红,18"};
//调用myFilter方法
ArrayList<String> array = myFilter(strArray, s -> s.split(",")[0].length() > 2, s -> Integer.parseInt(s.split(",")[1]) > 18);
//注意myFilter方法的参数有三个,第一个是字符串数组,第二个和第三个参数是Lambda表达式
//注意分隔字符数组,第二个参数拿的是分隔的第一个字符串数据,即姓名,第三个参数拿的是分隔的第二个数字符串据(需要转换为整型),即年龄
//注意第一个参数我们需要的是字符串,本来就是字符串所以不需要转换,第二个参数我们需要的是整型,所以需要对拿到的字符串数据做一下转换
//最后myFilter方法返回的是一个ArrayList集合,所以我们需要在左边接收一下
//再遍历返回的ArrayList集合
for (String str : array) {
System.out.println(str);
}
}
//定义一个方法,通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中
private static ArrayList<String> myFilter(String[] strArray, Predicate<String> pre1, Predicate<String> pre2) {
//定义一个ArrayList集合
ArrayList<String> array = new ArrayList<String>();
//把数组中满足要求的数据存储到ArrayList集合中
//遍历数组
for (String str : strArray) { //拿到集合中的每一个字符串
if (pre1.and(pre2).test(str)) {//对str做逻辑判断,逻辑判断是pre1和pre2的与运算。如果返回的是true,就把字符串添加到集合中
array.add(str);
}
}
return array;
}
}