Jin's Dev Story

[JAVA] 람다식 본문

Programming Language/JAVA

[JAVA] 람다식

woojin._. 2023. 7. 19. 11:28

람다함수란?

익명 함수를 지칭하는 용어
함수를 단순하게 표현하는 방법

람다의 장단점

장점

  1. 코드의 간결성
  2. 지연연산 수행
  3. 병렬처리 가능

단점

  1. 람다식의 호출이 까다로움
  2. 람다 스트림 사용 시 반복문 사용 시 성능이 떨어짐
  3. 가독성이 떨어질 수 있음

 

람다식 표현

1. 메서드의 이름과 반환 타입을 제거하고 ‘→’ 를 블록 {} 앞에 추가

2. 반환값이 있는 경우 식이나 값만 적고 return문 생략 가능( ; 생략)

3. 매개변수의 타입이 추론이 가능하면 생략 가능

주의사항

  • 매개변수가 하나인 경우 괄호() 생략 가능(타입이 없는 경우)
  • 블록 안의 문장이 하나뿐일 때 괄호{} 생략 가능(끝에 ; 생략)
  • 하나뿐인 문장이 return문이면 괄호{} 생략 불가
  • return문과 중괄호를 같이 생략 가능


@Functionallnterface

구현해야 할 추상 메소드가 하나만 정의된 인터페이스를 가리킴

  • 인자 x, y를 받아들여 x + y를 리턴하는 람다식 만들기
    //인자 x, y를 받아들여 x+y를 리턴하는 람다식 만들기
    //함수형 인터페이스
    @FunctionalInterface
    interface MyFunction {
        int calc(int x, int y);
    }
     
    public class LambdaEx {
        
        public LambdaEx() {
    //        MyFunction f = new MyFunction() {
    //
    //            @Override
    //            public int calc(int x, int y) {
    //                return x+y;
    //            }
    //            
    //        };
            
            MyFunction f1 = (x, y) -> {return x+y;};
            System.out.println("f1의 결과: " + f1.calc(22, 100));
            
            MyFunction f2 = (x, y) -> {return x-y;};
            System.out.println("f2의 결과: " + f2.calc(99, 9));
        }
     
        public static void main(String[] args) {
            new LambdaEx();
     
        }
     
    }
    
    // 출력 결과
    // f1의 결과 : 122
    // f2의 결과 : 90
  • 인자 x를 받아들여 제곱을 리턴하는 람다식 만들기
    //인자 x를 받아들여 제곱을 리턴하는 람다식 만들기
    //함수형 인터페이스
    @FunctionalInterface
    interface Myfunction2 {
        int calc(int x);
    }
    public class LambdaEx2 {
        
        public LambdaEx2() {
            //Myfunction2 fsquare = (x) -> {return x*x;};
            Myfunction2 fsquare = (x) -> {return x*x;};
            System.out.println("fsquare의 결과: "+fsquare.calc(5));
        }
        public static void main(String[] args) {
            new LambdaEx2();
        }
     
    }
    
    // 출력 결과
    // fsquare의 결과 : 25
  • 매개변수가 없는 람다식 만들기
    //매개변수가 없는 람다식 만들기
    //함수형 인터페이스
    @FunctionalInterface
    interface MyFunction3 {
        void print();
    }
    public class LambdaEx3 {
     
        
        public LambdaEx3() {
            MyFunction3 fprint = () -> {System.out.println("Yoon's Dev");};
            fprint.print();
        }
        public static void main(String[] args) {
            new LambdaEx3();
        }
     
    }
  • 메서드의 인자로 람다식 전달
    //메소드의 인자로 람다식 전달
    //함수형 인터페이스
    @FunctionalInterface
    interface MyFunction4 {
        int calc(int x, int y);
    }
     
    public class LambdaEx4 {
        //메소드 정의 (메소드의 인자로 람다식 전달)
        
        static void printMultiply(int x, int y, MyFunction4 f) {
            System.out.println("실행 결과: " + f.calc(x, y));
        }
        public LambdaEx4() {
            printMultiply(100, 100, (x, y) -> {return x * y;});
        }
     
        public static void main(String[] args) {
            new LambdaEx4();
     
        }
     
    }

더블콜론(::)

  • 메소드 레퍼런스라고도 불림
  • 람다식과 같은 기능을 함
  • 인스턴스를 활용하여 메소드를 전달함
  List<String> list = List.of("Peter", "Thomas", "Edvard", "Gerhard");

  // 람다식
  list.forEach(item -> System.out.println(item));

  // 더블콜론
  list.forEach(System.out::println);