반응형
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식을 예제를 통해 좀 더 살펴보는 시간을 가졌습니다.
다들 감기조심하십시오.
참조
반응형
'language, framework, library > Java' 카테고리의 다른 글
[java] java Enum의 개념과 기본 메서드 (0) | 2020.03.11 |
---|---|
[Java 8] Java 8, Stream의 Collectors (0) | 2019.11.29 |
[Java 8] Java 8 Stream API Tutorial (0) | 2019.11.26 |
[Java 8] Java 8에서의 새로운 특징 (0) | 2019.11.19 |
[Java 8] 람다 표현식과 주의 사항 (0) | 2019.11.13 |
댓글