람다 조합
현재 보고 있는 책인 JAVA8 IN ACTION 에서는 람다에 대해서 너무 자세히 다루고 있습니다.
덕분에 많은 공부가 되었고, 포스팅 개수도 많이 늘어나고 있는 것 같습니다. ㅡㅡ^
오늘은 람다에 대한 마지막 포스팅은 람다를 연결해서 사용하는 방법에 대해 알아보려고 합니다.
람다가 수학식에 대하여 추상화를 한 것이라 했을 때, 우리는 각 식을 조합하여 복잡한 식을 만들 수 있다는 것을 생각해 볼 수 있습니다.
(잘 생각해보면, 굳이 람다가 아니더라도 if 절을 사용할 때 and 나 or 등을 사용하여 복잡한 컨디션을 만들고 있지 않나요?)
JAVA8은 람다 표현식을 더욱 적극적으로 사용할 수 있도록, 람다를 조합을 하거나 혹은 편리하게 사용하게 해줄 수 있는 메소드를 제공해줍니다.
1. Comparator
- reverse 메소드를 이용하여 역정렬을 사용할 수 있습니다.
1 2 3 4 5 | List<Apple> dataList = new ArrayList<>(); Comparator<Apple> compare = Comparator.comparing(Apple::getWeight); dataList.sort(compare); dataList.sort(compare.reversed()); | cs |
- thenComparing 메소드를 조건을 더 연결할 수 있습니다.
1 2 | // 무게가 같다면, 컬러로 dataList.sort(Comparator.comparing(Apple::getWeight).reversed().thenComparing(Apple::getColor)); | cs |
2. Predicate
- negate 메소드를 사용하여 반대 (!) 를 사용할 수 있습니다.
1 2 3 4 5 6 | BiFunction<String, Integer, Apple> creator2 = Apple::new; Apple apple2 = creator2.apply("green", 100); Predicate<Apple> isNotHeavy = (v) -> v.getWeight() > 150; System.out.println(isNotHeavy.negate().test(apple2)); // true | cs |
- and나 or를 사용할 수 있습니다.
1 2 3 4 5 | Predicate<Apple> isNotHeavy = (v) -> v.getWeight() > 150; // 사과의 무게는 150 이상 200 이하 이거나, 색이 green 인 경우 isNotHeavy.and((v) -> v.getWeight() < 200).or((v) -> v.getColor().equals("green")).test(apple2); | cs |
3. Function
우리가 보통 함수를 처음 배울 때, 이러한 표현을 배운적이 있습니다.
f(x) = x + 1
g(x) = x * 2
g(f(x)) = (x + 1) * 2
위와 같은 역할을 해줄 수 있는 메소드가 존재합니다. (andThen, compose)
1 2 3 4 5 6 | Function<Integer, Integer> f = (x) -> x + 1; // f(x) Function<Integer, Integer> g = (x) -> x * 2; // g(x) Function<Integer, Integer> fg = f.andThen(g); // g(f(x)) Function<Integer, Integer> gf = f.compose(g); // f(g(x)) | cs |
람다를 이어줌으로써, 복잡한 식을 보다 쉽게 작성할 수 있지만 아무래도 복잡한 식에 대해서는 메서드 레퍼런스를 사용하는 것이 좋아보입니다.
만드는 것은 간단해보일 수 있으나, 유지보수적인 면도 봐야겠죠. ㅎㅎ
이 것으로 람다에 대한 포스팅은 끝!!!! :-)
다음 포스팅부터는 자바8의 꽃인 Stream API에 대해 다루어 보려 합니다.
|
'개발이야기 > 함수형 프로그래밍' 카테고리의 다른 글
Stream과 Collection 차이 (0) | 2016.08.04 |
---|---|
Stream API (0) | 2016.08.03 |
메서드 레퍼런스 (0) | 2016.08.01 |
람다의 실제 형식 (0) | 2016.07.28 |
클로저와 람다 (2) | 2016.07.28 |