java - Java 中的 lambdaj 和多重排序条件

标签 java sorting collections lambdaj

我爱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();

最佳答案

官方 Lambdaj 页面上没有提供这样做的示例,但在每次调用 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 第 3 方方法用法。 ComparatorUtils.chainedComparator - 它来自 apache commons 集合。如果你的项目中没有这个作为依赖项,你可以自己编写。它只是遍历所有比较器,直到返回非零值。

关于java - Java 中的 lambdaj 和多重排序条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9794647/

相关文章:

java - 尝试构建 hibernate 条件查询时出现问题,该查询通过与连接表实体和复合键的多对多关联进行导航

javascript - 如何在 JavaScript 中对使用逗号分隔的数字 _and_ 符号的字符串数组进行最佳排序

java - 使用 java 8 lambda 最简单的对象列表排序

Scala:获取 Map.head 元素的键(和值)

java - 通过特定对象属性在 HashSet/ArrayList 中查找最大值

scala:以功能方式从集合中累积一个var(即没有vars)

java - Comparable 使用未经检查或不安全的操作

java - 使用 EasyMock 的 PowerMock Java URL

java - 有没有更优雅的方式来做到这一点? (不能更具描述性。)

python - 按成员变量正确排序列表