Programming/Java
[Java] - 4. 람다 표현식
rw-
2023. 4. 1. 17:20
728x90
4. 람다 표현식
람다
- (인자 리스트) -> {바디}
인자 리스트
- 인자가 없을 때: ()
- 인자가 한개일 때: (one) 또는 one
- 인자가 여러개 일 때: (one, two)
- 인자의 타입은 생략 가능, 컴파일러가 추론(infer)하지만 명시할 수도 있다. (Integer one, Integer two)
바디
- 화살표 오른쪽에 함수 본문을 정의한다.
- 여러 줄인 경우에 {}를 사용해서 묶는다.
- 한 줄인 경우에 생략 가능, reutrn도 생략 가능.
변수 캡처 (Variable Capture)
- 로컬 변수 캡처
- final이거나 effective final인 경우에만 참조할 수 있다.
- 그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일러가 방지한다.
- effective final
- 이것도 역시 자바 8부터 지원하는 기능으로 "사실상" final인 변수.
- final 키워드 사용하지 않은 변수를 익명 클래스 구현체 또는 람다에서 참조할 수 있다.
- 익명 클래스 구현체와 달리 "쉐도윙"하지 않는다.
- 익명 클래스는 새로 스콥을 만들지만, 람다는 람다를 감싸고 있는 스콥 같다.
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
public class FooLambda {
public static void main(String[] args) {
Supplier<Integer> get10 = () -> 10;
BinaryOperator<Integer> sum = (a, b) -> a + b;
System.out.println(sum.apply(10, 20));
UnaryOperator<Integer> plus10 = (i) -> i + 10;
UnaryOperator<Integer> multiply2 = (i) -> i * 10;
System.out.println(plus10.andThen(multiply2).apply(2));
FooLambda FooLambda = new FooLambda();
FooLambda.run();
}
private void run() {
int baseNumber = 10;
// 로컬 클래스
class LocalClass {
void printBaseNumber() {
int baseNumber = 11;
System.out.println("printBaseNumber(): " + baseNumber);
}
}
// 익명 클래스
Consumer<Integer> integerConsumer = new Consumer<Integer>() {
@Override
public void accept(Integer baseNumber) {
System.out.println("integerConsumer: " + baseNumber);
}
};
// 람다
IntConsumer printInt = (i) -> {
System.out.println("printInt: " + i + baseNumber);
};
printInt.accept(10);
integerConsumer.accept(10);
LocalClass localClass = new LocalClass();
localClass.printBaseNumber();
}
}
30
120
printInt: 1010
integerConsumer: 10
printBaseNumber(): 11
참고
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html#shadowing
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
728x90
반응형