2

私はラムダジが大好きでよく使っていますが、複数の並べ替え条件を使用してリストを並べ替えることができるかどうかはわかりません。

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

最初に色で、次に名前で並べ替え:

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();
4

1 に答える 1

12

これを行う例は、Lambdajの公式ページには記載されていませんが、sortLambdajを呼び出すたびに、指定された引数のコンパレータが作成されます。以下は、複数の属性で並べ替える方法の例です。

並べ替え:

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以外のサードパーティメソッドの使用法が1つあります。ComparatorUtils.chainedComparator--apachecommonsコレクションからのものです。プロジェクトに依存関係としてこれがない場合は、独自に作成できます。ゼロ以外が返されるまで、すべてのコンパレータを繰り返し処理します。

于 2012-04-15T01:47:00.967 に答える