2017-07-25 42 views
2

如何創建一個方法來接受比較器的通配符作爲參數,然後捕獲該類並使用比較器?傳遞和投射比較器作爲使用Lambda的方法的參數

public List<String> myFilter(Comparator<?> comp, Object value, Class c){ 
    return myList.stream() 
     .filter(s-> 
       comp.compare(c.cast(s), c.cast(value))>=0 
     ).collect(toList()); 
    } 

編輯: 好吧,其實,安德魯的回答很有意思,工作得很好:) 然而,鑑於評論,我真的應該想的是:而不是試圖在方法中投,期望,中投已經比較

所以內完成這將給:

public List<String> filter(Comparator<String> comp){ 
     return myList.filter(s->comp.compare(s, null)>=0).collect(toList()); 
    } 

,並調用它時,這應該是像

List<String> myNewList= filter((String s1, String s2)->{ 
        try{ 
         int i=Integer.parseInt(s1); 
         return Integer.compare(i, myRealCompareValue); 
       }catch(Exception e){ 
         e.printStackTrace(); 
        return null; 
       }); 

它看起來並不很漂亮,雖然....

+1

什麼是'myList'的類型以及如何申報? – assylias

+0

你不能。要麼比較器輸入正確,要麼沒有未經檢查的操作就不能使用它。 – Holger

+0

字符串。它在我的類的構造函數中聲明,它也接受列表作爲參數。 – Myoch

回答

0

事實上,我的問題的How do I define a method which takes a lambda as a parameter in Java 8?

可能重複的和我真正想要做的是

public List<String> myFilter(MyComparator c){ 
     return myList 
      .stream() 
      .filter(c::compare) 
      .collect(toList()); 
} 

帶接口MyComparator:

public interface MyComparator{ 
     public boolean compare(String s); 
    } 

然後這可以被稱爲:

List<String> myNewList=filter((String s)->s.compareTo(whateverString)>=0); 

甚至:

List<String> myNewList=filter((String s)->{ 
      try{ 
       return Integer.compare(Integer.parseInt(s), 10)>=0; 
      }catch(Exception e){ 
       return false; 
      });