Java8函数式接口Predicate实战

关于函数式接口

函数式接口 Funcational Interface 是指接口范围内只允许有一个抽象方法(不包括default和static方法)的接口。Java中有一些预定义的函数接口,如Predicate、consumer、supplier等。Lambda函数的返回类型(在JDK1.8中引入)也是一个函数接口。

  • 关于java接口抽象方法、default和static方法的使用,请看另一篇文章:

https://blog.csdn.net/IndexMan/article/details/128105852

关于Predicat接口

Predicat接口位于 java.util.function包下,它提高了代码的可管理性,有助于单独进行单元测试。尤其在我们对集合数据进行条件过滤时非常有用,它包含了
test抽象方法,和andornegativeisEqual 4个方法。

编码实战

public class PredicateDemo {
    public static List<String> STUDENTS = Arrays.asList(
      "Lucy","Tomas Kyte","James Bond","Yamlis","Jack Luis"
    );

    public static void testPredicateAnd(){
        Predicate<String> letterLengthLimit = s -> s.length() > 5;
        Predicate<String> letterStartWith = s -> s.startsWith("J");
        // 打印长度大于5并且以J开头的学生名字
        STUDENTS.stream().filter(
                letterLengthLimit.and(letterStartWith)
        ).forEach(System.out::println);
    }

    public static void testPredicateOr(){
        Predicate<String> letterLengthLimit = s -> s.length() > 5;
        Predicate<String> letterStartWith = s -> s.startsWith("J");
        // 打印长度大于5并且或者以J开头的学生名字
        STUDENTS.stream().filter(
                letterLengthLimit.or(letterStartWith)
        ).forEach(System.out::println);
    }

    public static void testPredicateNegative(){
        Predicate<String> letterLengthLimit = s -> s.length() > 5;
        Predicate<String> letterStartWith = s -> s.startsWith("J");
        // 打印长度大于5并且不是以J开头的学生名字
        STUDENTS.stream().filter(
                letterLengthLimit.and(letterStartWith.negate())
        ).forEach(System.out::println);
    }

    public static void testPredicateIsEqual(){
        Predicate<String> letterEqualPredicate = s -> Predicate.isEqual("Lucy").test(s);

        STUDENTS.stream().filter(
                letterEqualPredicate
        ).forEach(System.out::println);
    }

    public static void main(String[] args) {
        // 创建谓词函数
        Predicate<Integer> pr = a -> (a>18);
        // 利用谓词函数对参数做判断,满足谓词条件返回true否则false
        System.out.println(pr.test(19));

        System.out.println(">>>>测试and:");
        testPredicateAnd();
        System.out.println(">>>>测试or:");
        testPredicateOr();
        System.out.println(">>>>测试negative:");
        testPredicateNegative();
        System.out.println(">>>>测试isEqual:");
        testPredicateIsEqual();
    }
}
  • 输出:
true
>>>>测试and:
James Bond
Jack Luis
>>>>测试or:
Tomas Kyte
James Bond
Yamlis
Jack Luis
>>>>测试negative:
Tomas Kyte
Yamlis
>>>>测试isEqual:
Lucy
posted @ 2022-11-29 21:35  一锤子技术员  阅读(7)  评论(0编辑  收藏  举报  来源