ABOUT ME

-

오늘 방문자
-
어제 방문자
-
전체
-
  • [JAVA] 람다식과 함수형 인터페이스
    JAVA 2018. 11. 11. 23:00


    람다식은 익명클래스의 객체와 동등하다.



    1
    타입 변수  = (int a, int b) -> a>b?a:b;
    cs

    여기서 람다식의 참조변수의 타입은 뭘로해야할까?


    참조형 이니까 클래스 or 인터페이스로 타입을 정 할 수 있을 것이다.


    여기서는 함수형 인터페이스로 사용 하였다

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test_java;
     
    @FunctionalInterface
    public interface Member 
    {
        public int getMemberAge(int age);
     
    }
     
    cs

    @FunctionalInterface를 붙이면 컴파일러가 함수형 인터페이스를 올바르게 정의하였는지 확인해 줌으로 꼭 붙이는게 좋다.

    주의사항으로는 함수형 인터페이스에는 오직 1개의 추상메소드만 있어야 한다는 제약이 있다....
    하지만 static 메서드랑 defaut메서드의 개수에는 제약이 없다



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package test_java;
     
    import java.io.IOException;
     
    public class Main 
    {
     
        public static void main(String[] args) throws IOException
        {
            
            Member memberAge = (int age)->
            {
                return age;
            };
            
            int age = memberAge.getMemberAge(3);
            System.out.println(age); // 3
            
        }        
    }//CLASS END
    cs

    이 처럼 Member인터페이스를 구현한 익명객체를 람다식으로 대체 가능한 이유는

    람다식은 실제로 익명객체이고,  

    Member인터페이스를 구현한 익명객체의 메서드 getMemberAge와 람다식의 매개변수의 타입,개수,반환값이 같기 때문이다.



    기존에 인터페이스의 메서드를 구현하는 방법을 보자

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package test_java;
     
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
     
    public class Main 
    {
     
        public static void main(String[] args) throws IOException
        {
            
            List<String> list = Arrays.asList("a""b","c","d");
            Collections.sort(list, new Comparator<String>() 
            {
                public int compare(String a, String b) 
                {
                    return b.compareTo(a);
                }
            });
            System.out.println(list); // d c b a
            
        }        
    }//CLASS END
    cs


    람다식으로 표현

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package test_java;
     
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
     
    public class Main 
    {
     
        public static void main(String[] args) throws IOException
        {
            
            List<String> list = Arrays.asList("a""b","c","d");
            Collections.sort(list, (a, b)->b.compareTo(a));
            
            System.out.println(list); // d c b a
            
        }        
    }//CLASS END
    cs


    훨씬 간결해지는 것을 볼 수 있다.





    람다식을 매개변수로 던지는 방법이다


    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test_java;
     
    @FunctionalInterface
    public interface Member 
    {
        public void showMessage();
        
    }
     
    cs



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package test_java;
     
    import java.io.IOException;
     
    public class Main 
    {
     
        public static void main(String[] args) throws IOException
        {
            getMessage(()->
            {
                System.out.println("안녕하세요!!");
            }); 
        }
        
        public static void getMessage(Member message) 
        {
            message.showMessage(); // 안녕하세요 출력
        }
    }//CLASS END
    cs













    댓글

Designed by Tistory.