본문 바로가기
Development/Java

기본적인 자바 람다(Lambda)

by Nahwasa 2023. 4. 3.

 

개인적으로 가독성이 좋은지 잘 모르겠어요.

  개인적으로 람다가 정말 가독성이 좋은진 잘 모르겠다. 그렇다고 안쓴다는 얘기는 아니고, 쓰긴 쓴다. 다만 쓸 수 있다고 너무 아무대나 다 써버리면 읽기 편하다는 장점이 오히려 사라지는 것 같다. 코드가 짧다고 항상 가독성이 좋은건 아니다.

 

  익명 클래스를 사용한 A보다는 람다를 사용한 B가 더 보기 편한게 맞다.

 

  보기 편하긴 하지만 결국 아래처럼 좀 생소한 클래스에 써있다면 결국 까봐야 한다.

 

  특히 생성자가 많다면 더 헷갈릴 것 같다. (물론 인텔리제이 기준 ctrl 누른상태로 클릭하면 해당 생성자로 바로 이동하긴 한다.)

 

  아무튼 개인적으로 그렇다는거고, 코드가 더 짧아져서 어느 수준 이상의 실력이라면 보기 편한게 사실이다. 그러니 기본은 알아두자.

 

 

람다 기본

  기본은 간단하다. 추상 메소드가 하나인 인터페이스라면 람다로 사용할 수 있다.

public interface LambdaPractice {

    int sum(int a, int b);
}

public class Main {

    public static void main(String[] args) throws Exception {
        LambdaPractice lambdaPractice = (a, b) -> a + b;
        System.out.println(lambdaPractice.sum(5, 6));
    }
}

 

  추상 메소드가 2개 이상이라면 에러난다.

 

  추상 메소드가 1개여야 하므로 default 메소드나 static 메소드 같은건 상관없다.

public interface LambdaPractice {

    int sum(int a, int b);

    default int sub(int a, int b) {
        return a-b;
    }

    static int mult(int a, int b) {
        return a*b;
    }
}

public class Main {

    public static void main(String[] args) throws Exception {
        LambdaPractice lambdaPractice = (a, b) -> a + b;
        System.out.println(lambdaPractice.sum(5, 6));
    }
}

 

 

@FunctionalInterface

  어노테이션을 붙여주면 컴파일 타임에서 추상 메소드가 여러개라면 에러를 내준다. 그러므로 람다로 사용하고 싶다면 붙여주는게 좋다.

 

- 정상

 

- 2개 이상이면 에러

 

 

메소드 참조

  어차피 이미 만들어져 있는 함수가 있다면 굳이 람다로 새로 구현할 필요도 없을꺼다. 그럼 아래처럼 해줄 수 있다. Integer의 sum 함수를 사용하겠다는 의미이다.

public class Main {

    public static void main(String[] args) throws Exception {
        LambdaPractice lambdaPractice = Integer::sum;
        System.out.println(lambdaPractice.sum(5, 6));
    }
}