자바 람다식 소개

JAVA/JAVA8 2014. 8. 14. 18:20
728x90
반응형

얼마전에 이클립스 루나가 업데이트 되서 설치까지 마쳤습니다.

이클립스 루나에서는 자바8의 모든기능을 지원하게 됬는데요.
요즘 트렌드에 맞춰 아이콘이나 디자인들도 변경된것이 눈에 보입니다.


아무튼 업데이트된사항을 여러가지 살펴보니 람다식 이란게 있습니다.
이 람다는 파이선에서 먼저 지원되던것이라고 한데 자바8 업데이트에서 채택된 기능으로
기존의 반복이나 비교문들의 가독성을 대폭적으로 향상시켜주는 등의 효과를 가져옵니다.
저도 몇번 따라해보는것으로 기능을 익혀서 어떻게 사용해야할지는 조금더 지켜봐야겠지만
플러그인쪽이라면 객체배열을 가져와서 처리할때 도움이 되겠네요.
아무튼 각설하고 간단한 반복문과 람다식을 비교해드리겠습니다.

1
2
3
4
5
6
7
8
9
10
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
        
    for (Integer num : list)
    {
        if (num % 2 == 0)
        {
            System.out.println(num);
        }
        
    }

이 코드는 0부터 10까지 숫자가 들어간 ArrayList객체를 만들어서 foreach문으로 가져온 숫자가 2로 나누었을때 나머지가 0일경우 출력을 합니다.

이경우는 아래처럼 간단하게 바뀝니다.

1
2
    ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
    list.stream().filter((Integer num) -> num % 2 == 0).forEach(num -> System.out.println(num));

ArrayList객체를 자바8에서 추가된 Stream객체로 변환해서 특정 조건에 맞는 객체만 남겨둡니다.
그리고 forEach메서드를 통해서 출력하죠.
원래 [(Integer num) -> num % 2 == 0] 의 자리에는 java.util.function.Predicate 객체가 들어가고 
[num -> System.out.println(num)] 의 자리에는 java.util.function.Consumer 레퍼런스 객체가 들어가야합니다.
하지만 람다식을 적음으로써 JVM이 식을 객체로 생성해서 처리하게 해주죠.

이번에는 코드를 조금 변형해 보겠습니다.
0~10까지의 숫자들을 제곱한값이 10보다 클경우 그 제곱값을 출력하도록 해보겠습니다.
그렇다면 결과는 16, 25, 36, 49, 64, 81, 100이 나오겠네요.
이것을 람다식으로 짜보겠습니다.

1
2
    ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
    list.stream().map(num -> num * num).filter((Integer num) -> num > 10).forEach(num -> System.out.println(num));

중간에 map메서드가 끼어들었습니다.
Stream객체의 모든 객체에 특정 연산을 적용시키고 싶을때 사용합니다.
그러니까 Stream객체의 모든 값에 제곱을한뒤에 그 값이 10보다 크면 출력하게 되는거죠.

대충 감은 잡히셨나요.?
그럼 마지막으로 람다식으로 정렬을 하는것으로 마무리하겠습니다.
보통 ArrayList를 정렬할때는 어떤 기준이 되는 값을 기준으로 정렬하겠죠.
오름차순이던 내림차순간에요. 람다식은 이렇게 간단하게 정리합니다.
1
2
3
    ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(10 , 1, 5, 8, 7, 6, 2, 4, 3, 9));
    list.sort((n1, n2) -> n2 - n1);
    System.out.println(list);
내림차순으로 정리했습니다.
그럼 오름차순은요.?

1
2
3
    ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(10 , 1, 5, 8, 7, 6, 2, 4, 3, 9));
    list.sort((n1, n2) -> n1 - n2);
    System.out.println(list);

저게 다입니다.
기존의 정렬을 위해서는 Comparator 인터페이스의 객체를 생성해줘야했지만
이제는 람다식으로 Comparator레퍼런스의 객체를 생성해서 처리할수 있습니다.
우리는 람다식을 이용해서 조금더 직관적으로 코드에 접근할수 있게 됬죠.


정리하면
java.util.function.Funtion, java.util.function.Predicate
java.util.function.Consumer, java.util.Comparator 객체의 자리에 람다식이 대신 들어갈수 있습니다.
그리고 참조할객체의 이름을 적고 우측의 -> 으로 화살표를 적은후 조건문이나 명령문을 적어줍니다.
한가지의 동작이 아닌 여러 동작을 하고 싶다면 중괄호를 쓸수도 있습니다.
이 이경우 조건이나 값을 반환해야 하는 경우는 return예약어를 사용하면됩니다.

1
2
3
4
5
6
7
8
    ArayList<Integer> list = new ArrayList<Integer>(Arrays.asList(10, 1, 5, 8, 7, 6, 2, 4, 3, 9));
    list.sort((n1, n2) ->
    {
        System.out.println(n1 + " " + n2);
        return n1 - n2;
    });
 
    System.out.println(list);
비슷한 꼴이면 될겁니다.
참고로 람다를 사용하지 않으면 이런 모양입니다.

list.sort(new Comparator<Integer>()
{
    public int compare(Integer n1, Integer n2)
   {
   System.out.println(n1 + " " + n2);
   return n1 - n2;
   }

});

간략하게 람다에 대해서 알아봤고
쓸만한 기능인것 같으니 연구를 조금더 해봐야 겠네요.

제가 람다를 공부한 주소입니다.
728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,