본문 바로가기
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));
        }
    }

     

    댓글