이전에 정의했던 익명 함수를 지칭하는 용어이기도 하면서 대충 클래스를 선언해서 메서드를 만들고... 이게 너무 비효율적이라고 여겨서 나오게 된 거 + 코드를 간결하게 하기 위함의 이유로 나온 함수이다.
람다 왜 쓰냐
코드가 간결해진다.
public class LambdaTest {
public static void main(String[] args) {
MyInterface m1 = new MyInterface() { //1.익명을 이용한 MyInterface 구현부
@Override
public int max(int a, int b){
return a > b ? a : b;
}
};
System.out.println(m1.max(5,10));
MyInterface m2 = (a,b) -> { return a > b ? a : b;}; // 2.람다를 이용한 구현부
System.out.println(m2.max(5,10));
}
}
@FunctionalInterface // 함수형 인터페이스
interface MyInterface{
public int max(int a, int b);
}
람다의 조건
- 인터페이스 + 추상 메서드가 하나만 있을 때 사용 가능하다.(= 함수형 인터페이스에만 사용 가능)
함수형 인터페이스인지 확인하는 방법: @FunctionalInterface 어노테이션을 이용
- 람다식은 메서드명, 변수 정보를 간략화해서 표시한다.
- 당연히 메서드가 많다면 어떤 메서드를 호출할지 모르니까 람다식이 안된다.
람다의 특징
- 결국 메서드이기 때문에 외부의 멤버 변수 접근에 별다른 제약이 없다. (그 안쪽에 구현되었기 때문이다.)
- 같은 이유로 외부 로컬 변수의 값을 바꿀 수 없다.(참조형이 매개변수면 주소값이기에 가능)