정의
- 익명 함수(Anonymous Function) 를 간결하게 표현하는 문법
- 메서드 이름 없이, “함수의 구현부만” 표현 가능
- Java 8 이상부터 지원
- 형식 비교:
- Java 문법: (매개변수) -> { 실행문 }
- JavaScript 문법: (매개변수) => { 실행문 }
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("쓰레드 실행");
}
}).start();
new Thread(() -> System.out.println("쓰레드 실행")).start();
목적
- 메서드 선언 없이 코드를 간결하게 표현
- 불필요한 익명 클래스 제거 → 가독성 향상
- 함수형 프로그래밍(Functional Programming) 구현 가능
주요 사용처
| 구분 | 설명 |
|---|
| Stream API | 데이터 처리(필터링, 매핑, 집계 등) |
| Java GUI (Swing, AWT 등) | 이벤트 리스너 간소화 |
| 컬렉션 프레임워크 | List, Map, Set 내부 처리 간편화 |
| 인터페이스 | 형태 | 설명 | 주요 메서드 | 예시 |
| ------------------ | ------------ | ---------------------- | ------------------- | ---------------------------- |
| Function<T, R> | 입력 → 반환 | 입력값 T 받아 R 반환 | R apply(T t) | x -> x * 2 |
| Supplier | () → 반환 | 입력 없이 T 반환 | T get() | () -> Math.random() |
| Consumer | 입력 → void | 입력값 받아 소비 | void accept(T t) | x -> System.out.println(x) |
| Predicate | 입력 → boolean | 입력값 평가 후 true/false 반환 | boolean test(T t) | x -> x > 0 |
Function<Integer, Integer> square = x -> x * x;
Supplier<Double> random = () -> Math.random();
Consumer<String> printer = s -> System.out.println(s);
Predicate<Integer> isEven = n -> n % 2 == 0;
활용
| 구분 | 설명 | 예시 |
|---|
| ① 추상 메서드 구현체 | 함수형 인터페이스 구현 시 | Runnable r = () -> System.out.println("실행"); |
| ② 컬렉션 프레임워크 | forEach, removeIf 등 | list.forEach(System.out::println); |
| ③ 정렬 시 | Comparator 람다 사용 | list.sort((a, b) -> a.length() - b.length()); |
메서드 참조 (Method Reference)
람다식을 더 간결하게 표현할 수 있는 문법
(매개변수) -> 클래스명.메서드명(매개변수) → 클래스명::메서드명
| 형태 | 예시 | 의미 |
|---|
| 정적 메서드 참조 | ClassName::staticMethod | Math::abs |
| 인스턴스 메서드 참조 | object::instanceMethod | System.out::println |
| 생성자 참조 | ClassName::new | ArrayList::new |
List<String> names = List.of("Kim", "Lee", "Park");
names.forEach(System.out::println);