구아바 주문 가이드

1. 개요

이 기사에서는 Guava 라이브러리의 Ordering 클래스를 살펴 보겠습니다 .

주문은 클래스 구현하는 비교기 인터페이스를 우리에게 작성 및 비교기 체인을위한 유용한 유창하게 API를 제공합니다.

간단한 참고로 유사한 기능을 제공 하는 새로운 Comparator.comparing () API를 살펴볼 가치가 있습니다. 여기에 해당 API를 사용하는 실용적인 예가 있습니다.

2. 주문 생성

Ordering 에는 컬렉션 의 sort () 메서드 또는 Comparator 인스턴스 가 필요한 다른 모든 곳에서 사용할 수있는 적절한 인스턴스를 반환하는 유용한 빌더 메서드 가 있습니다.

natural () 메서드를 실행하여 자연 순서 인스턴스를 만들 수 있습니다 .

List integers = Arrays.asList(3, 2, 1); integers.sort(Ordering.natural()); assertEquals(Arrays.asList(1,2,3), integers);

Person 개체 의 컬렉션이 있다고 가정 해 보겠습니다 .

class Person { private String name; private Integer age; // standard constructors, getters }

그리고 우리는 연령 필드 별로 그러한 개체의 목록을 정렬하려고 합니다. 이를 확장하여 정확히 수행 할 사용자 정의 Ordering 을 만들 수 있습니다 .

List persons = Arrays.asList(new Person("Michael", 10), new Person("Alice", 3)); Ordering orderingByAge = new Ordering() { @Override public int compare(Person p1, Person p2) { return Ints.compare(p1.age, p2.age); } }; persons.sort(orderingByAge); assertEquals(Arrays.asList(new Person("Alice", 3), new Person("Michael", 10)), persons);

그런 다음 orderingByAge 를 사용 하여 sort () 메서드에 전달할 수 있습니다 .

3. 연결 순서

이 클래스의 유용한 기능 중 하나는 서로 다른 순서 지정 방법을 연결할 수 있다는 것 입니다. 개인 컬렉션이 있고이를 연령 필드 별로 정렬 하고 목록 시작 부분에 null 연령 필드 값 이 있다고 가정 해 보겠습니다 .

List persons = Arrays.asList( new Person("Michael", 10), new Person("Alice", 3), new Person("Thomas", null)); Ordering ordering = Ordering .natural() .nullsFirst() .onResultOf(new Function() { @Override public Comparable apply(Person person) { return person.age; } }); persons.sort(ordering); assertEquals(Arrays.asList( new Person("Thomas", null), new Person("Alice", 3), new Person("Michael", 10)), persons);

여기서 주목해야 할 중요한 것은 특정 Ordering 이 실행되는 순서입니다. 순서는 오른쪽에서 왼쪽입니다. 따라서 먼저 onResultOf () 가 실행되고 해당 메서드가 비교할 필드를 추출합니다.

그런 다음 nullFirst () 비교기가 실행됩니다. 그 때문에, 그 결과 분리 수거는 것이다 사람의 이 객체 는 null 가 AS 나이 목록의 시작 부분에 필드.

정렬 프로세스가 끝나면 natural () 메서드를 사용하여 지정된 자연 순서를 사용하여 연령 필드를 비교합니다 .

4. 결론

이 기사에서는 더 유창하고 우아한 Comparator 를 만들 수있는 Guava 라이브러리의 Ordering 클래스를 살펴 보았습니다 . 맞춤 주문을 만들고 API에서 미리 정의 된 주문 을 사용했으며 더 많은 맞춤 주문을 달성하기 위해 연결했습니다.

이러한 모든 예제 및 코드 스 니펫의 구현은 GitHub 프로젝트에서 찾을 수 있습니다. 이것은 Maven 기반 프로젝트이므로 그대로 가져 와서 실행할 수 있어야합니다.