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 }
