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