프로그래밍이 복잡해지고 선언적여지는 추세에 있는 와중에, JAVA에서 컬렉션과 스트림을 잘사용할 수 있는 방향을 찾으며 생겨난 것이다.(이라고 생각한다.)
옛날부터 함수를 간접적으로 전달할 때 익명함수를 활용했다. 하지만 익명클래스는 코드가 길고 복잡하다. 람다를 사용하면 가독성, 간결, 스트림과 잘 어울리는 장점으로 람다를 권장하는 추세이다.
람다식은 메서드가 아닌, 익명 클래스의 인스턴스(객체)이다. 먼저 람다식을 살펴보면 아래와 같다.
(int a, int b) -> a > b ? a : b;
위와 같은 람다식은 실제로는 아래처럼 생겼다. 익명 클래스의 인스턴스를 하나 만들고 내부적으로 메서드를 가지게 했다.
new Objcet() {
int max(int a, int b) {
return a > b ? a : b;
}
}
더 나아가 람다식으로 메서드를 전달해 사용할 수 있게 만드는 방법은 다음과 같다.
아래처럼 인터페이스에 단 하나의 추상메서드만 구현하면 된다. @FunctionalInterface를 붙이면 올바르게 함수형 인터페이스를 정의했는지 체크해준다. 즉 public메서드가 1개 초과하면 컴파일 에러를 발생시킨다.
@FunctionalInterface
public interface 무기{
void 공격();
}
아래처럼 람다식을 전달해 사용할 수 있다.
public class Main {
public static void main(String[] args){
군인 soldier = new 군인();
solder.공격(()->System.out.println("빵야"));
solder.공격(()->System.out.println("와장창"));
}
}
람다식 문법
(인자 목록) -> { 로직 }
원래 기존의 함수형태를 보면 다음과 같다
void foo() {
System.out.println("나는 함수다요");
}
람다로 표현하면 아래와 같다. 함수의 이름과 타입이 추론가능하면 없앨 수 있다.
() -> {
System.out.println("나는 함수다요");
};
Return값이 결과값이면 축약할 수 있다. 이 경우엔 return void형태라 return값은 존재하지 않는다.
() -> System.out.println("나는 함수다요");
다음과 같이도 쓸 수 있다.
(a, b) -> a > b ? a: n
전통적인 방법
**for** (**int** i = 0; i < 10; i++) {
System.out.println(i);
}람다식을 사용하여 만드는 방법
IntStream.range(0, 10).forEach((**int** value) -> System.out.println(value));
IntStream.range(0, 10).forEach(value -> System.out.println(value));
IntStream.range(0, 10).forEach(System.out::println);
https://dwaejinho.tistory.com/entry/Java-Lambda-Stream-도입-배경과-원리-파해치기