반응형
https://javabydeveloper.com/java-lambda-expression-with-examples/
해당글은 상기 링크의 내용을 참고하여 작성하였습니다.
1. 람다식이란?
- 자바 람다식이란 어느 클래스에도 속하지 않은 메소드를 의미한다
- 람다식은 익명함수 이며 메소드를 argument로 넘겨주는것이 가능하다
- 람다식은 자바에 함수형 프로그래밍의 이점을 가져오기 위해 도입하였다
2. 람다식 문법
람다식은 아래 세개의 구성요소로 이루어져 있다
- Argument-list : 람다식의 argument. empty여도 된다
- Arrow-token: arguments-list와 body를 연결해주는 기능을 한다.
- Body: 람다식의 로직을 담는다.
예제
(int a, int b) -> {System.out.println(a+b);};
2.1 argument의 타입은 컴파일러에 의해 자동으로 결정될 수 있습니다.
즉 아래와 같이 타입을 생략 할 수 있습니다.
(a, b) -> {System.out.println(a+b);};
2.2 argument자리의 파라미터가 하나이고 컴파일러에 의해 타입이 유추될 수 있으면 아래와 같이 argument자리의 () 괄호를 생략 할 수 있습니다.
num -> {System.out.println(num % 2);};
2.3 body에 여러 statements 를 작성 할 수 있습니다. 여러 코드줄을 작성할경우 {} curly brace로 묵어주어야 합니다.
num -> {
System.out.println(num % 2);
System.out.println(num > 10);
};
만약 함수가 한줄이면 curly brace를 생략 할 수 있습니다.
num -> System.out.println(num % 2);
2.4 람다식을 작성하면 메소드 호출하듯이 호출 할 수 있습니다. 여기서 functional interface가 필요합니다. functional interface란 하나의 추상 메소드만을 가질 수 잇는 interface 입니다. @FunctionalInterface annotation을 이용하여 하나의 추상메소드만을 가지도록 강제 할 수 있습니다.
(찾아보니 abstract 메소드 제외하고 default 메소드와 static 메소드 여러개 가질 수 있음. java 1.8 버전부터)
람다식은 functional interface의 구현과 같음을 기억!
Example1
@FunctionalInterface
interface MyFunctionalInterface {
void add(int a, int b);
}
public class LambdaTest1 {
public static void main(String[] args) {
// Lambda Expreassion 1
MyFunctionalInterface f = (int a, int b) -> {
System.out.println(a * b);
};
f.add(4, 5);// 20
// Lambda Expreassion 2
MyFunctionalInterface f2 = (a, b) -> System.out.println(a + b);
f2.add(4, 5);// 9
}
}
결과
20
9
Example2
자바의 스레드에 사용되는 Runnable 클래스는 대표적인 functional interface 입니다. 아래 예제에서 람다식이 Runnable 클래스 안에있는 run 메소드를 참조하고, Runnable클래스가 다시 Thread클래스를 참조하여 스레드를 실행시키는 것을 볼 수 있습니다.
public class LambdaTest1 {
public static void main(String[] args) {
new Thread(() -> {
for(int i=0; i < 5; i++)
System.out.println("Child Thread "+i);
}).start();;
for(int i=0; i < 5; i++) {
System.out.println("Main Thread "+i);
}
}
}
결과
Main Thread 0
Main Thread 1
Main Thread 2
Main Thread 3
Main Thread 4
Child Thread 0
Child Thread 1
Child Thread 2
Child Thread 3
Child Thread 4
Example3
Predicate라는 builtin Functional interface를 이용한 예제입니다.
public class LambdaTest3 {
public static void main(String[] args) {
// Defining Lambda Expression for Predicate Functional interface
Predicate<Integer> p = number -> (number % 2 == 0);
System.out.println(p.test(10));//true
System.out.println(p.test(11));//false
}
}
참고로 람다식이 한줄이고 계산식인 경우 해당 값을 자동으로 return해 줍니다.
여러줄일경우, 람다식이 리턴값을 요구하는 경우 {} 안에 return값을 넣어주어야 합니다.
https://javagoal.com/return-type-of-lambda-expression/
Example4
아래 예제는 foreach에 람다식을 사용한 예제입니다. foreach는 인풋으로 Consumer 객체를 받는데 이 또한 functional interface 입니다.
public class LambdaTest4 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Peter");
list.add("Gerhard");
list.add("Philip");
list.add("John");
list.forEach(value -> System.out.println(value));
}
}
결과
Peter
Gerhard
Philip
John
반응형
'Java > java상식' 카테고리의 다른 글
자바 ::(더블 콜론)의 의미 (0) | 2021.07.07 |
---|---|
final 클래스 final 메소드 (0) | 2021.06.10 |
자바의 접근지시자 종류 (1) | 2021.06.10 |
자바 점점점 의미 (0) | 2021.06.01 |
[자바/java] 자바에서 public class와 class의 차이 (0) | 2021.05.24 |
댓글