반응형
람다
(인자 리스트) -> { 바디 }
// 인자 -> 바디
Function<Integer, Integer> plus10 = (i) -> i + 10;
인자 리스트
- 인자가 없을때 : ()
- 인자가 한개일 때: (one) 또는 one
- 인자가 여러개 일 때 : (one, two)
- 인자의 타입은 생략 가능, 컴파일러가 추론(infer)하지만 명시할 수도 있다. (Integer one, Integer two)
바디
- 화상표 오른쪽에 함수 본문을 정의한다.
- 여러 줄인 경우에 {}를 사용해서 묶는다
- 함 줄인 경우에 생략 가능, return도 생략 가능
import java.util.function.BinaryOperator;
import java.util.function.Supplier;
public class Foo {
public static void main(String[] args) {
//인자가 없을때인 경우, 만약 바디가 한줄이면 {} 제거해줘도 된다.
Supplier<Integer> get10 = () -> 10;
//인자의 값이 2개인 경우
BinaryOperator<Integer> sum = (a, b) -> a + b;
}
}
변수 캡쳐 (Variable Capture)
- 로컬 변수 캡쳐
- final이거나 effective final 인 경우에만 참조할 수 있다
- 그렇지 않을 경우 concurrency 문제가 생길 수 잇어서 컴파일가 방지한다.
- effective final
- 이것도 역시 자바8 부터 지원하는 기능으로 사실상 final인 변수
- final 키워드 사용하지 않은 변수를 익명 클래스 구현체 또는 람다에서 참조할 수 있다.
- 익명 클래스 구현체와 달리 '쉐도윙'하지 않는다.
- 익명 클래스는 새로 스콥을 만들지만, 람다는 람다를 감싸고 있는 스콥과 같다.
import java.util.function.Consumer;
import java.util.function.IntConsumer;
public class Foo {
public static void main(String[] args) {
Foo foo = new Foo();
foo.run();
}
private void run() {
// 익명, 로컬, 람다의 공통점은 final int baseNumber = 10; 참조 할수 있다.
final int baseNumber = 10;
// 익명 Class
Consumer<Integer> integerConsumer = new Consumer<Integer> () {
@Override
public void accept(Integer integer) {
System.out.println (baseNumber);
}
};
//Local Class
class LocalClass{
void printBaseNumber() {
System.out.println (baseNumber);
}
}
//람다
IntConsumer printInt = (i) ->{
System.out.println ( i + baseNumber );
};
printInt.accept(10);
}
}
참고
백기선 - 더 자바, Java8
https://www.inflearn.com/course/the-java-java8/dashboard
'Language > Java' 카테고리의 다른 글
인터페이스 기본 메소드와 스태틱 메소드 (0) | 2022.06.19 |
---|---|
메소드 레퍼런스 (0) | 2022.06.18 |
자바에서 제공하는 함수형 인터페이스 (0) | 2022.06.18 |
함수형 인터페이스와 람다 표현식 소개 (0) | 2022.06.15 |
java8과 java11 차이점 (0) | 2022.05.08 |