프로그래밍 언어에서 함수(메서드)를 간단한 식(expression)으로 표현하는 방식.
Java에서 람다식은 익명함수(anonymous function)의 한 형태로, 메서드에 대한 구현을 간결하게 표현하는 방법이다.
Java에서 모든 메서드는 클래스 내에 포함되어야 한다.
람다식은 메서드를 하나의 식(expression)으로 표현하여 함수를 간략하면서도 명확하게 표현하는 문법이다. 그런데 Java에서 메서드는 클래스에 속하는 것이므로, 람다식은 사실 메서드와 동등한 것이 아니라 함수형 인터페이스를 구현한 익명 클래스의 객체와 같다고 할 수 있다.
익명클래스 클래스의 선언과 생성을 동시에 하는 내부 클래스
@FunctionalInterface
interface Ex{
public abstract int max(int a, int b);
}
public class LambdaEx {
public static void main(String[] args) {
// 같은 표현
Ex ex = new Ex(){
@Override
public int max(int a, int b){
return a > b ? a : b;
}
};
// 같은 표현
Ex ex2 = (a, b) -> a > b ? a : b;
}
}
이처럼 Java는 인터페이스를 통해 람다식을 다루며, 람다식을 다루기 위한 인터페이스를 함수형 인터페이스(functional interface)라고 한다. 즉 람다식(익명 객체)을 다루기 위한 참조 변수의 타입은 함수형 인터페이스다.
java.util.function 패키지에 함수형 인터페이스가 다수 정의되어 있다.
메서드를 하나의 식(expression)으로 표현하므로 함수를 간략하면서도 명확하게 표현할 수 있게 된다.
메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 람다식을 '익명 함수'라고도 한다.
람다식을 메서드의 매개변수로 전달하는 것도 가능하며, 메서드의 결과로 반환될 수 있다.
람다식으로 인해 메서드를 변수처럼 다룰 수 있게 된다.
람다식의 구조
(parameters) -> {expression}
메서드에서 이름과 반환 타입을 제거하고 매개변수 선언부와 몸통 {} 사이에 ->를 추가한다.

| 경우 | 설명 |
|---|---|
| 반환 값이 있는 메서드의 경우, 문장이 아닌 식으로 표현할 수 있다. | |
| 식의 연산 결과가 자동적으로 반환값이 되기 때문이다. | |
| 문장이 아니므로 세미콜론을 식 끝에 붙이지 않는다. | |
| 중괄호를 생략 가능한 경우 | 중괄호 안의 문장이 return문이 아니면서(return문 대신 식으로 표현하면서), |
| 메서드의 구현부가 단일 문장일 경우. | |
| 세미콜론 X | |
| ()괄호를 생략 가능한 경우 | 매개변수의 타입을 추론할 수 있어 매개변수의 타입이 없고(생략했으며), 매개변수가 하나일 경우 |
@FunctionalInterface
interface StringOperation{
String apply(String s);
}
public class LambdaApply {
public static void main(String[] args) {
StringOperation toUpperCase = s -> s.toUpperCase();
StringOperation toLowerCase = s -> s.toLowerCase();
String input = "Lambda Expressions";
System.out.println(processString(input, toUpperCase));
System.out.println(processString(input, toLowerCase));
}
public static String processString(String input, StringOperation operation){
return operation.apply(input);
}
}
@FunctionalInterface
interface StringOperation{
String apply(String s);
}
public class LambdaApply {
public static void main(String[] args) {
StringOperation toUpperCase = getStringOperateToUpperCase();
String input = "Lambda Expressions";
System.out.println(processString(input, toUpperCase));
}
public static StringOperation getStringOperateToUpperCase(){
StringOperation toUpperCase = s -> s.toUpperCase();
return toUpperCase;
}
}