람다식(lambda expression)

  • 메서드를 하나의 식으로 표현한 것
  • 메드를 변수처럼 다루는 것이 가능해짐
public interface A {
	void m();
}

예를들어 위와 같은 함수형 인터페이스가 있다고 가정하자

함수형 인터페이스

  • 하나의 추상 메소드와 선언을 포함한 인터페이스
  • 단일 추상 메소드를 가진다
public class AA implements A {
	public void m() {
		System.out.println("AA");
	}
}
public class Test {
	public static void main(String[] args) {
		A a1 = new AA();
	}
}

기존에는 A 라는 인터페이스의 메소드를 사용하기 위해 A 인터페이스를 implements한 AA클래스를 받아와서 정의하였다

public class Test {
	A a2 = new A() {
		public void m() {
			System.out.println("익명내부클래스");
		}
	}
}

또는 익명 내부 클래스를 사용할 수도 있다

public class Test{
	A a3 = () -> System.out.println("람다식");
}

람다식은 위와 같은 익명 내부 클래스에서 new 를 생략하고 메소드(어차피 하나밖에 없기 때문에)도 생략한 뒤 구현 내용을 입력하는것이 람다식이다

람다식으로 사용하는 인터페이스는 반드시 메소드가 하나여야 하고, 람다식에 구현하는 메소드의 내용은 인터페이스 메소드의 내용이다


람다식 표현 방법

public interface A { // 파라미터 x, 리턴값 x
	void m(); 
}
 
public interface A { // 파라미터 o, 리턴값 x
	void m(String str); 
}
 
public interface A { // 파라미터 x, 리턴값 o
	String m(); 
}
 
public interface A { // 파라미터 o, 리턴값 o
	int m(int x, int y); 
}
 
public class Test{
	public static void main(String[] args) {
		A a = () -> System.out.println("A");
		
		B b = str -> System.out.println(str); // 파라미터가 하나라면 괄호도 생략 가능
		
		
		C c = () -> {
			System.out.println("C");
			return "C";
		}
		
		// 만약 구현부가 1줄이라면 {}와 return을 함께 생략해야함
		
		// C c = () -> "C"; 
		
		D d = (x, y) -> x + y
	}
 
}

람다식으로 사용할 인터페이스에는 @FunctionalInterface 를 붙여주면 메소드를 더 이상 추가할 수 없음

Ref.