лямбдадж и условия множественной сортировки в Java - PullRequest
2 голосов
/ 21 марта 2012

Я люблю lambdaj и часто его использую, но я не могу понять, возможно ли отсортировать список с использованием нескольких условий сортировки.

Вот примериспользуя 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();

1 Ответ

12 голосов
/ 15 апреля 2012

Примеры действий, которые не приведены на официальной странице 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);
}

Недостатки:

Существует один сторонний метод, не использующий лямбдадж.ComparatorUtils.chainedComparator - это из коллекции Apache Commons.Если у вас нет этого в качестве зависимости в вашем проекте, вы можете написать свой собственный.он просто перебирает все компараторы, пока не вернется ноль.

...