我們經常操作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;
}
|