学习Java8系列-Lambda

小王在公司正在开发一个学生管理系统,产品经理向他提出一个需求,要筛选出年龄大于15的学生,于是小王写出了以下代码:

    public static List<Student> filterAgeStudent(List<Student> students) {
        List<Student> list = Lists.newArrayList();
        for (Student student : students) {
            if (student.getAge() > 15) {
                list.add(student);
            }
        }
        return list;
    }

过了几天产品经理又提出了一个需求,要筛选出体重大于50KG的学生,于是小王新增了一个方法:

    public static List<Student> filterWeightStudent(List<Student> students) {
        List<Student> list = Lists.newArrayList();
        for (Student student : students) {
            if (student.getWeight() > 50) {
                list.add(student);
            }
        }
        return list;
    }

过了一段时间,产品提出了要筛选出体重大于50并且年龄要大于15的学生,小王突然感觉到这不是一个简单的需求,于是小王仔细思考了一下,突然想到将每种筛选的策略抽象成为一个接口,并且将这个接口当做一个参数传入方法中,这样每次就可以只新增策略,其他代码不需要更改了,这样就满足了软件设计的六大原则的开放闭合原则,于是乎诞生以下的设计和代码:

学习Java8系列-Lambda

public interface StudentPredicate {
    boolean filter(Student student);
}
public class AgeStudentPredicate implements StudentPredicate {
    @Override
    public boolean filter(Student student) {
        return student.getAge() > 20 ? true : false;
    }
}
public static List<Student> filterStudent(List<Student> students,
                                              StudentPredicate predicate)
 
{
    List<Student> list = Lists.newArrayList();
    for (Student student : students) {
       if (predicate.filter(student)) {
          list.add(student);
       }
    }
    return list;
}

经过一段时间的学习,小王接触到匿名类,于是小王代码进行更改,以后再也不需要写策略了:

List<Student> list = filterStudent(students, new StudentPredicate() {
     @Override
     public boolean filter(Student student) {
         return student.getAge() > 15;
     }
});

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxfjx.html