2012-03-20 3 views
2

나는 lambdaj을 좋아하고 그것을 많이 사용하지만 여러 정렬 조건을 사용하여 목록을 정렬 할 수 있는지는 알 수 없습니다.lambdaj와 Java의 다중 정렬 조건

다음은 Google Collections을 사용한 예입니다. lambdaj에서 같은 일을 할 수 있습니까?

결과 순위는 첫째 색상별로 다음 이름으로 공식 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 제 3 자 방식의 사용이있다. ComparatorUtils.chainedComparator - 아파치 공유지 컬렉션에서 가져온 것입니다. 프로젝트에 종속성이 없다면 직접 작성할 수 있습니다. 0이 아닌 값이 반환 될 때까지 모든 비교자를 반복합니다.