JavaSE-23.1.4【常用函数式接口之Predicate、Predicate案例-筛选满足条件数据】
1 package day14.lesson1; 2 3 import java.util.function.Predicate; 4 5 /* 6 1.8 常用函数式接口之Predicate 7 8 Predicate<T>接口通常用于判断参数是否满足指定的条件 9 10 boolean test(T t) 对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值 11 default Predicate negate() 返回一个逻辑的否定,对应逻辑非 12 default Predicate and(Predicate other)返回一个组合判断,对应短路与 13 default Predicate or(Predicate other) 返回一个组合判断,对应短路或 14 */ 15 public class Demo8Predicate { 16 public static void main(String[] args) { 17 /*boolean b1 = checkString( 18 "hello", 19 (String s) -> { 20 return s.length()>8; 21 } 22 );*/ 23 boolean b1 = checkString("hello", s -> s.length()>8); 24 System.out.println(b1); // #1:false #2:true #3:true 25 boolean b2 = checkString("helloworld", s -> s.length()>8); 26 System.out.println(b2); // #1:true #2:false #3:false 27 28 System.out.println("=================================="); 29 30 boolean b3 = checkString("hello", s -> s.length()>8, s -> s.length()<15); 31 System.out.println(b3); // &&and:false ||or:true 32 boolean b4 = checkString("helloworld", s -> s.length()>8, s -> s.length()<15); 33 System.out.println(b4); // &&and:true ||or:true 34 } 35 36 // 判断给定字符串是否满足要求 37 private static boolean checkString(String str, Predicate<String> pre){ 38 // return pre.test(str); // #1 39 // return !pre.test(str); // #2 取反 40 return pre.negate().test(str); // #3 效果同#2,这是逻辑非官方写法 41 } 42 43 // 同一个字符串给出两个不同的判断条件,最后把这两个判断的结果做逻辑与运算的结果作为最终的结果 44 private static boolean checkString(String str, Predicate<String> pre1, Predicate<String> pre2){ 45 /*boolean b1 = pre1.test(str); 46 boolean b2 = pre2.test(str); 47 boolean b = b1 && b2; // 短路逻辑与 48 return b;*/ 49 // return pre1.and(pre2).test(str); // 效果同上 50 51 /*boolean b1 = pre1.test(str); 52 boolean b2 = pre2.test(str); 53 boolean b = b1 || b2; // 短路逻辑或 54 return b;*/ 55 return pre1.or(pre2).test(str); // 效果同上 56 } 57 }
1 package day14.lesson1; 2 3 import java.util.ArrayList; 4 import java.util.function.Predicate; 5 6 /* 7 1.9 Predicate案例-筛选满足条件数据 8 9 需求 10 String[] strArray = {"林青霞,30", "柳岩,34", "张曼玉,35", "貂蝉,31", "王祖贤,33"}; 11 字符串数组中有多条信息,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,并遍历ArrayList集合 12 同时满足如下要求:姓名长度大于2;年龄大于33 13 分析 14 有两个判断条件,所以需要使用两个Predicate接口,对条件进行判断 15 必须同时满足两个条件,所以可以使用and方法连接两个判断条件 16 */ 17 public class Demo9Predicate { 18 public static void main(String[] args) { 19 String[] strArray = {"林青霞,30", "柳岩,34", "张曼玉,35", "貂蝉,31", "王祖贤,33"}; 20 21 /*ArrayList<String> array = myFilter( 22 strArray, 23 (String s) -> { 24 String name = s.split(",")[0]; 25 return name.length()>2; 26 }, 27 (String s) -> { 28 String ageStr = s.split(",")[1]; 29 int age = Integer.parseInt(ageStr); 30 return age>33; 31 } 32 );*/ 33 ArrayList<String> array = myFilter( 34 strArray, 35 s -> s.split(",")[0].length() > 2, 36 s -> Integer.parseInt(s.split(",")[1]) > 33 37 ); 38 39 for (String s: array){ 40 System.out.println(s); 41 } 42 // 张曼玉,35 43 } 44 45 private static ArrayList<String> myFilter(String[] strArr, Predicate<String> pre1, Predicate<String> pre2){ 46 ArrayList<String> arrayList = new ArrayList<>(); 47 48 for (String str: strArr){ 49 if(pre1.and(pre2).test(str)){ 50 arrayList.add(str); 51 } 52 } 53 54 return arrayList; 55 } 56 }