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 }

 

posted @ 2021-06-17 14:29  yub4by  阅读(76)  评论(0编辑  收藏  举报