Lambda란?
- 람다는 람다 대수(lambda calculus)에서 유래한다.
- 람다 대수에서 람다식(lambda expression)은 수학의 함수를 단순하게 표현하는 방법이다.
- 이름 없는 함수(익명함수), 람다식(lambda expression) 혹은 람다 함수(lambda function)로 불린다.
Lambda 구조
매개변수 리스트
- 매개변수 리스트에는 함수에 전달되는 매개변수들이 나열된다.
- 매개변수를 생략하면 컴파일러가 추론 기능을 이용하여 알아서 처리한다.
- 매개변수가 하나인 경우 괄호를 생략할 수 있다
애로우 토큰(->)
- 애로우 토큰은 매개변수 리스트와 함수 코드를 분리시키는 역할이다.
- 매개변수들을 전달하여 함수 바디 { }에 작성된 코드를 실행한다는 의미로 알아두면 된다.
함수 바디
- 함수 바디는 함수의 코드이다.
- 중괄호({ })로 둘러싸는 일반적이지만, 한 문장인 경우 중괄호({ })를 생략해도 된다.
- 문장이더라도 return 문이 있으면 반드시 중괄호로 둘러싸야 한다.
Lambda작성법
기본작성
(int id) -> { System.out.println("ID는 " + id); }
타입생략
- 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할수 있다.
- (id) -> { System.out.println("ID는 " + id); }
괄호생략
- 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.
- id -> System.out.println("ID는 " + id); // ()와 {} 생략
중괄호생략1
- 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다.
- (이때 세미콜론(;)은 붙이지 않음) - (String name) -> name.length()
중괄호생략2
- 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.
- (x, y) -> { return x + y; } // 합을 리턴하는 람다식
표현식으로 가능한 경우
- (x, y) -> x + y; // return 생략 가능. x+y의 합을 리턴하는 람다식
Lambda 구현하기
람다식은 함수형 인터페이스에 선언된 추상 메소드를 구현하는 방식이다.
1. 함수형 인터페이스 작성
함수형 인터페이스는 추상메소드 하나만 있는 인터페이스이다.
매개변수 0개
interface LambdaEx0 { // 함수형 인터페이스
void print() // 추상 메소드
}
매개변수 1개
interface LambdaEx1 {
int calc(int x);
}
매개변수 2개
interface LambdaEx2 {
int calc(int x, int y);
}
추상메소드를 람다식으로 구현
(x ,y) -> {return x+y; } = > int calc(int x, int y) { return x+y; }
2. 추상메소드를 람다식으로 구현
(x ,y) -> {return x+y; } = > int calc(int x, int y) { return x+y; }
3. 람다식 변수에 치환
square:
LambdaEx1 square= (x) - >x*x;
add:
LambdaEx2 add = (x, y) - >{return x+y; };
minus:
LambdaEx2 minus = (x, y) - >{return x-y; };
4. 람다식 호출
System.out.println(square.calc(2));
System.out.println(add.calc(2,3));
System.out.println(minus.calc(2,3));
5.람다식 매개변수로 넘기기
static void printMultiply(int x, int y, lamdaFunction4 f) { // f로 (x,y)->x*y람다식 전달받음
System.out.println(f.calc(x, y));
}
printMultiply(3, 4, (x,y)->x/y); // 람다식((x,y)->x*y)을 매개변수로 전달
@FunctionalInterface 사용하여 컴파일 에러 막기
@FunctionalInterface의 사용은 컴파일러에게 인터페이스가 추상 메소드가 1개만 있는 함수형 인
터페이스인지 확인하도록 하여, 처음부터 잘못된 인터페이스 작성을 막는 장점이 있다.
//정상동작
@FunctionalInterface
interface Lamda {
int calc(int x, int y);
}
// 컴파일에러발생
// 추상 함수가 2개임.
@FunctionalInterface
interface Lamda { // 이 라인에 컴파일 오류 발생
int calc(int x, int y);
void print();
}
재네릭 함수형 인터페이스
@FunctionalInterface
interface MyFunction<T> { // 제네릭 타입 T를 가진 함수형 인터페이스
void print(T x); // 람다식으로 구현할 추상 메소드
}
MyFunction<String> f1 = (x) -> System.out.println(x.toString());
f1.print("ABC"); // String 객체를 람다식에 넘겨준다.
MyFunction<Integer> f2 = (x) -> System.out.println(x.toString());
f2.print(Integer.valueOf(100)); // Integer 객체를 람다식에 넘겨준다.
구현코드
public class LambdaTest {
interface LambdaEx1 {
int calc(int x);
}
interface LambdaEx2 {
int calc(int x, int y);
}
@FunctionalInterface
interface LambdaEx3<T> {
void print(T x);
}
public static void printDivide(int x, int y, LambdaEx2 f) {
System.out.println(f.calc(x, y));
}
public static void main(String[] args) {
LambdaEx1 square = (x) -> x*x;
LambdaEx2 add = (x,y) -> { return x+y; };
LambdaEx2 minus = (x,y) -> { return x-y; };
System.out.println(square.calc(2));
System.out.println(add.calc(2,3));
System.out.println(minus.calc(2,3));
printDivide(6,3, (x,y)->x/y);
LambdaEx3<String> stringLambda = (x) -> System.out.println(x.toString());
stringLambda.print("ABC");
LambdaEx3<Integer> intLambda = (x) -> System.out.println(x);
intLambda.print(Integer.valueOf(100));
}
}
'Language > Java' 카테고리의 다른 글
[Java] Annotation (0) | 2021.08.20 |
---|---|
[Java] Collection Framework (0) | 2021.08.20 |
[Java] Sort (0) | 2021.05.29 |
[Java] ArrayList to String[] (0) | 2021.05.23 |
[Java] ArrayList (0) | 2021.05.10 |
댓글