(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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM