정의
코드에서 간결하고 명확하게 함수를 정의하고 사용할 수 있게 함
익명함수를 쉽게 작성할 수 있으며, 주로 함수형 인터페이스와 함께 사용
예제
// 1. 람다는 인터페이스로 만든다.
// 2. 인터페이스에는 메서드가 하나만 존재하야한다.
// 3. 메서드가 인터페이스를 매개변수로 받고 있으면 , 행위를 달라는 뜻
// 4. 매개변수의 타입을 생략 가능
// 5. @FuctionInterface 표시 가능
public class App {
public static void main(String[] args) {
MyConsumer<Integer> r1 = data -> {
System.out.println("소비할 데이터 : " + data);
};
r1.accept(1);
MySupplier<String> r2 = () -> { return "good";}; // 코드가 여러줄이고 리턴이 필요하면 사용
MySupplier<String> r3 = () -> "good"; // 중괄호를 생략하면 자동으로 리턴 : 리턴을 생략가능
String msg = r3.get();
System.out.println(msg);
}
}
// 입력을 받아서 결과를 반환 - 이런걸 finctioninterface라고 함
public interface MyFunction<T,R> {
R apply(T t);
}
// 소비자
// 입력만 받고 출력이 없는 연산을 수행 - 공급만 받고 여기안에서 소비하겠다
public interface MyConsumer<T> {
void accept(T data);
}
// 입력없이 값을 반환(리턴) - 공급자
@FunctionalInterface
public interface MySupplier<T>{
T get();
}
// 입력을 받아서 논리값을 반환
public interface MyPredcate<T> {
Boolean apply(T t);
}
장점
- 코드 간결성 : 코드가 더 간결하고 읽기 쉬음
- 익명 함수 사용 : 익명 클래스를 사용할 필 요없이 함수를 간단히 정의
- 함수형 프로그래밍 지원 : 함수형 인터페이스와 함께 사용되어 함수형 프로그래밍을 지원
단점
- 가독성 저하 : 복잡한 로직을 람다식으로 처리할려고 하면 오히려 가독성 저하
- 디버깅 어려움 : 람다식은 익명 함수이기 때문에 디버깅 과정에서 스택 트레이스를 읽기 어려움
- 성능 : 일부 경우 람다 표현식이 일반 메서드 호출보다 성능이 떨어질 수 있음
- 접근 : 람다식 내에서 this 키워드는 람다식을 포함하는 클래스의 인스턴스를 참조- 익명클래스와 달리 람다식 자체의 this를 참조 불가
Share article