2012-03-20 3 views
2

私はlambdajが大好きですが、たくさん使っていますが、複数のソート条件を使ってリストをソートすることが可能かどうかはわかりません。lambdajとJavaの複数のソート条件

Google Collectionsを使用した例です。ラムダジでも同じことができますか?

ソートは最初の色によって、その名前によって:公式Lambdajページで提供されていないことの

Function<Fruit, Color> getColorFunction = new Function<Fruit, Color>() { 
public Color apply(Fruit from) { 
    return from.getColor(); 
} 
}; 

Function<Fruit, String> getNameFunction = new Function<Fruit, String>() { 
public String apply(Fruit from) { 
    return from.getName(); 
} 
}; 

Ordering<Fruit> colorOrdering = Ordering.natural().onResultOf(getColorFunction); 
Ordering<Fruit> nameOrdering = Ordering.natural().onResultOf(getNameFunction); 

Ordering<Fruit> colorAndNameOrdering = colorOrdering.compound(nameOrdering); 

ImmutableSortedSet<Fruit> sortedFruits = ImmutableSortedSet.orderedBy(
    colorAndNameOrdering).addAll(fruits).build(); 
+0

[LambdaCollections](http://code.google.com/p/lambdaj/wiki/LambdaCollections)はそうしていませんか? – MadChuckle

答えて

11

例として、しかし、あなたが呼び出しているフードの下たびsort Lambdajは、与えられた引数のコンパレータを作成します。以下は、複数の属性で並べ替える方法の例です。

並べ替え:

public static void main(String... args) { 
    final Comparator byName = new ArgumentComparator(on(Fruit.class).getName()); 
    final Comparator byColor = new ArgumentComparator(on(Fruit.class).getColor()); 
    final Comparator orderBy = ComparatorUtils.chainedComparator(byName, byColor); 

    final List<Fruit> unsorted = Arrays.asList(...); 

    final List<Fruit> sorted = sort(unsorted, on(Fruit.class), orderBy); 

    System.out.println(sorted); 
} 

ダウンサイド:

つの非lambdajサードパーティのメソッドの使用量があります。 ComparatorUtils.chainedComparator - これはApacheのコモンズコレクションからのものです。プロジェクトに依存関係がない場合は、自分で作成することができます。ゼロ以外の値が返されるまで、すべてのコンパレータを繰り返し処理します。