函数式接口的简单使用之Predicate

Posted zhandoublog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式接口的简单使用之Predicate相关的知识,希望对你有一定的参考价值。

我们经常操作List,例如现在有一个功能要求在所有人中筛选出年龄在20岁以上的人。

public class MyTest {
    private final List<Person> allPersonList;
 
    {
        Person p1 = new Person("风清扬"42);
        Person p2 = new Person("独孤求败"66);
        Person p3 = new Person("令狐冲"16);
        Person p4 = new Person("东方不败"25);
        allPersonList = ImmutableList.of(p1, p2, p3, p4);
    }
 
    @Test
    public void test() {
        List<Person> ageGreateThanTwenty = getAgeGreateThanTwenty();
        System.out.println(ageGreateThanTwenty);
    }
 
    private List<Person> getAgeGreateThanTwenty() {
        List<Person> persons = Lists.newArrayList();
        for (Person p : allPersonList) {
            if (p.getAge() > 20) {
                persons.add(p);
            }
        }
        return persons;
    }
}

上述代码很好的完成了需求,这时候需求要求增加查询大于三十岁的人的需求,那也好说,再写一个方法getAgeGreateThanThirty,这当然是开个玩笑,肯定是把年龄当做参数传入来写。

private List<Person> getAgeGreateThan(int age) {
    List<Person> persons = Lists.newArrayList();
    for (Person p : allPersonList) {
        if (p.getAge() > age) {
            persons.add(p);
        }
    }
    return persons;
}

非常容易对不对,这个时候需求又出现了小于。等于。小于等于,大于等于,小于多少并且大于多少,这就有点麻烦了,用一个过滤器来过滤他们吧。

public void test() {
    List<Person> ageGreateThanTwenty = filter(allPersonList, p -> p.getAge() >= 30);
    System.out.println(ageGreateThanTwenty);
}
 
private List<Person> filter(List<Person> persons, Predicate<Person> predicate) {
    List<Person> result = Lists.newArrayList();
    for (Person person : persons) {
        if (predicate.test(person)) {
            result.add(person);
        }
    }
    return result;
}

这个时候可就是需求你尽管改,我只要变成新的过滤代码传进去就可以完成,但是上述做法还不够好的一点就是固定了Person类,改成泛型,灵活性会更好。

public void test() {
    List<Person> ageGreateThanTwenty = filter(allPersonList, p -> p.getAge() >= 30);
    System.out.println(ageGreateThanTwenty);
}
 
private <T> List<T> filter(List<T> lists, Predicate<T> predicate) {
    List<T> result = Lists.newArrayList();
    for (T t : lists) {
        if (predicate.test(t)) {
            result.add(t);
        }
    }
    return result;
}

以上是关于函数式接口的简单使用之Predicate的主要内容,如果未能解决你的问题,请参考以下文章

使用lambda表达式和函数式接口Predicate

Java常用函数式接口--Predicate接口使用案例

431常用的函数式接口-Predicate接口-默认方法and和432常用的函数式接口-Predicate接口-默认方法or&negate

JDK8新特性之函数式接口

JDK8系列之使用Function函数式接口实现回调

Predicate函数式接口