zoukankan      html  css  js  c++  java
  • (5)函数式接口的简单使用之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;
    }
  • 相关阅读:
    在类的外面调用类的private函数
    Django多表操作
    Django聚合与分组查询中value与annotate的顺序问题
    Django路由控制
    cookie与session的区别与关系
    面试题之改变对象的类
    python实现双向链表
    python实现单向循环链表
    python中的顺序表
    顺序表
  • 原文地址:https://www.cnblogs.com/zhandouBlog/p/9383234.html
Copyright © 2011-2022 走看看