我们经常操作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;
} |