람다식(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 를 붙여주면 메소드를 더 이상 추가할 수 없음