본문 바로가기
프로그래밍/Java

[java 8] 예제로 보는 lambda식_비교하기

by 사바라다 2019. 11. 18.

Lambda식 없이 정렬 하기

Java8이전의 Sort는 Comparator interface를 implement하여 구현하여 사용하곤 했습니다. 아래와 같이 말이지요.

public class Human {
    private String name;
    private int age;

    // standard constructors, getters/setters, equals and hashcode
}

/*
 * Test Class [Client]
 */
 @Test
 public void sortEntitiesByName() {
     List<Human> humans = Arrays.asList(new Human("A", 20), new Human("B", 21));

     Collections.sort(humans, new Comparator<Human>() {
         @Override
         public int compare(Human h1, Human h2) {
             return h1.getName().compareTo(h2.getName());
         }
     });

    assertThat(humans.get(0).getAge(), is(21));
 }

오늘은 람다 표현을 통해 위 예제를 간단하게 변형해 보도록하겠습니다.

기본 Lambda 사용방법

lambda 표현식을 이용하면 익명클래스를 간단하게 변경할 수 있습니다. 위의 예제를 한번 바꿔 보겠습니다.

 public void sortEntitiesByName() {
     List<Human> humans = Arrays.asList(new Human("A", 20), new Human("B", 21));

     Collections.sort(humans, (Human h1, Human h2) -> h1.getName().compareTo(h2.getName()));

    assertThat(humans.get(0).getAge(), is(21));
 }

간단하게 lambda 표현식을 적용했을 때 이렇게 간단해지는 것을 확인할 수 있습니다. lambda 표현식을 적용할 경우 type에 대해 명시하지 않아도 됩니다.

즉,

(Human h1, Human h2) -> h1.getName().compareTo(h2.getName())
(h1, h2) -> h1.getName().compareTo(h2.getName())

위의 2개의 lambda식은 동일하게 적용됩니다.

method를 통한 참조

다른 방법으로는 lambda식을 method를 통해 참조하는 방법이 있습니다. parameter를 통해 함수로 처리하는 방법입니다. 위의 예제로 이어서 보겠습니다. 아래 함수를 Humans class에 추가합니다.

/** (h1, h2) -> h1.getName().compareTo(h2.getName())
  * 에 대해서 function을 아래와 같이 제작할 수 있습니다.
  */

public static int compareByNameThenAge(Human lhs, Human rhs) {
    if (lhs.name.equals(rhs.name)) {
        return lhs.age - rhs.age;
    } else {
        return lhs.name.compareTo(rhs.name);
    }
}

그러면 아래와 같이 사용할 수 있습니다.

 public void sortEntitiesByName() {
     List<Human> humans = Arrays.asList(new Human("A", 20), new Human("B", 21));
    humans.sort(Humans::compareByNameThenAge);
    assertThat(humans.get(0).getAge(), is(21));
 }

Comparator instance이용하기

Comparator interface의 comparing이라는 static method를 이용해 보겠습니다. 아래 예제는 name을 이용하여 humans을 정렬하는 방법입니다. 아래와 같이 변경할 수 있습니다.

 public void sortEntitiesByName() {
     List<Human> humans = Arrays.asList(new Human("A", 20), new Human("B", 21));
    Collections.sort(humans, Comparator.comparing(Human::getName));
    assertThat(humans.get(0).getAge(), is(21));
 }

마무리

오늘은 이렇게 저번 시간에 이어서 lambda식을 예제를 통해 좀 더 살펴보는 시간을 가졌습니다.

다들 감기조심하십시오.

참조

https://www.baeldung.com/java-8-sort-lambda

댓글