2

我喜欢lambdaj并且经常使用它,但我似乎无法弄清楚是否可以使用多个排序条件对列表进行排序。

这是使用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();
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 3rd 方方法用法。ComparatorUtils.chainedComparator- 它来自 apache commons 集合。如果您在项目中没有此作为依赖项,则可以编写自己的。它只是遍历所有比较器,直到返回非零。

于 2012-04-15T01:47:00.967 回答