2016-11-22 15 views
1

私は管理用曲のリストを持っていますので、これは私の今の曲を並べ替える基準です。これをラムダ式に "変換"するにはどうすればよいですか?特定のコンパレータをラムダ式に変換するにはどうすればよいですか?

gestionCancionList.sort(new Comparator<GestionCancion>() { 
     @Override 
     public int compare(GestionCancion t1, GestionCancion t2){ 
      return t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
        t1.song.dameInterprete().compareTo(t2.song.dameInterprete()) 
        : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite); 
     } 
    } 

答えて

1

さらに簡単:

Comparator<GestionCancion> aName = (t1,t2) -> t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
      t1.song.dameInterprete().compareTo(t2.song.dameInterprete()) 
      : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite); 

パラメータの種類は、コンパレータのジェネリック型によって暗示されています。

を編集してください:これは上記よりも簡単に行うことができます。コンパレータは個別に定義する必要はありません。ラムダ式はすぐにsortメソッドに渡すことができます。その場合、パラメータの型は、コレクションオブジェクトのジェネリック型によって暗示されます。したがって:メソッド参照(可能性)と

gestionCancionList.sort((t1,t2) -> t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
      t1.song.dameInterprete().compareTo(t2.song.dameInterprete()) 
      : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite)); 
0

シンプル

Comparator<GestionCancion> aName = (GestionCancion t1, GestionCancion t2)->t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
       t1.song.dameInterprete().compareTo(t2.song.dameInterprete()) 
       : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite); 

here

+0

ありがとう、私はアイデアを参照してください私は単一のメソッドを使用していない場合、同じメソッドを比較するにwiriteする。 "Comparator aName =(GestionCancion t1、GestionCancion t2) - > compare(t1、t2)" –

+0

私は参考のために簡単な例を添付しました。 – Raghuveer

3

使用Comparatorファクトリメソッド:

Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed() 
    .thenComparing(GestionCancion::dameInterprete); 

は、あなたのコードを作る:

gestionCancionList.sort(
    Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed() 
    .thenComparing(GestionCancion::dameInterprete)); 

トリックを維持するためにreversed()を適用することですコードはきちんとしている。ラムダの明示的なタイピングがフィールドにアクセスする際(; - 必要に応じて実際のタイプを代用私はVecesを想定し、あなたがどのようなタイプvecesQueSeRepite私たちに示していない)が必要とされていることを

は注意してください。

+0

有望ですが、残念なことに 'vecesQueSeRespite'はメソッドではなくフィールドであり、これらの値の比較は逆です。 –

+0

@StuartMarks 'vecesQueSeRespite'フィールドの逆の比較を使用するようにコードを更新しました – Bohemian

+0

これは改善されましたが、それでも動作しません。しかし、努力のために:-) +1。型推論は、 'reversed()'が使われたときに崩壊する傾向があります。また、 'dameInterprete'は' GestionCancion'のメソッドではありませんので、メソッド参照の代わりにラムダを使用する必要があります。型推論の問題を避けるために、lambda argの明示的な型を持つlambdaを書く必要がありました。 '(GestionCancion gc) - > gc.song.dameInterprete()'となります。最後に、 'vecesQueSeRepite'はいくつかの型のプリミティブのように見えるので、' comparisonInt'などを使ってボクシングを避けるべきです。それでも、元の回答や他の回答よりも良い結果が得られます。 –

関連する問題