2017-07-25 5 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()); 
    } 

EDIT: [OK]を、実際には、アンドリューの答えは非常に興味深いですし、非常にうまく動作します:) しかし、コメントが与えられ、私が本当に欲しいすべきことは次のとおりです。代わりにメソッド内でキャストしようと、期待しますキャストはすでにので、これは与えるだろう、コンパレータ内

を行われていたこと:

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; 
      }); 
関連する問題