자바의 람다식에 대해 학습하세요.
메서드 |
람다식 |
int max(int a, int b) { return a > b ? a : b; } |
(int a, int b) -> { return a > b ? a : b; } |
(int a, int b) -> a > b ? a : b |
|
(a, b) -> a > b ? a : b |
public class LambdaTest {
@FunctionalInterface
interface TestFunction{
public abstract void test();
}
public static void main(String[] args) {
TestFunction f = () -> System.out.println("테스트");
f.test();
}
}
익명 내부 클래스와의 비교
public class LambdaTest {
@FunctionalInterface
interface TestFunction{
public abstract void test();
}
public static void main(String[] args) {
TestFunction f = new TestFunction(){
@Override
public void test() {
System.out.println("테스트");
}
};
f.test();
}
}
람다식 내에서 외부에 선언된 변수에 접근하는 방법
@FunctionalInterface
interface Test{
public abstract void method();
}
public class Capture {
public static void main(String[] args) {
int a = 1;
Test t = () -> {
a = 30;//에러
System.out.println("a="+a);
};
t.method();
}
}
메소드 참조는 람다 표현식이 단 하나의 메소드 만을 호출하는 경우에 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해준다.
메서드 참조 기본 문법 |
(Object name)::(Method name) |
import java.util.function.*;
public class Prog {
public static void main(String[] args){
DoubleUnaryOperator oper;
oper = (n) -> Math.abs(n); // 람다 표현식
System.out.println(oper.applyAsDouble(-5));
oper = Math::abs; // 메소드 참조
System.out.println(oper.applyAsDouble(-5));
}
}
생성자를 호출하는 람다 표현식도 앞서 살펴본 메소드 참조를 이용할 수 있다
즉, 단순히 객체를 생성하고 반환하는 람다 표현식은 생성자 참조로 변환할 수 있습니다.
객체를 생성하고 반환하는 람다 표현식
(a) -> { return new Object(a); }
위의 예제를 생성자 참고를 사용하여 변경
Object::new;
참고자료
- 자바의 정석 3판
- 코드를 통해 본 빵형의 실전 Java
https://perfectacle.github.io/2019/06/30/java-8-lambda-capturing/
https://tourspace.tistory.com/6
http://www.tcpschool.com/java/java_lambda_reference