참고
람다식?
- 익명함수를 생성하기 위한 식
- 자바에서는 '매개변수를 가진 코드 블럭'
특징
- 람다식으로 변환할 수 있는 인터페이스: 추상메서드가 1개인 인터페이스
- 함수적 인터페이스(@FunctionalInterface)만 가능
형식
사용시
인터페이스명 객체변수명 = 람다식;
람다식 형식
(매개변수들...) -> {처리할 코드들;...}
예시 - T01_LambdaTest
main()내
Thread th1 = new Thread (
new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
);
th1.start();
Thread th2 = new Thread(
() -> {
for (int i = 0; i < 10; i++) {
System.out.println("람다 - " + i);
}
}
);
th2.start();
람다식 작성 방법
- 기본형식:
(자료형이름 매개변수명, ...) -> { 실행문들; ... }
(int a) -> { System.out.println(a); }
(a) -> { System.out.println(a); }
a -> { System.out.println(a); }
a -> System.out.println(a)
() -> System.out.println(a)
(a, b) -> { return a+b; }
(a, b) -> return a + b;
(a, b) -> a + b
예시 - T02_LambdaTest.java
1단계: LambdaTestInterface.java
- 함수적 인터페이스 => 추상메서드가 1개만 선언된 인터페이스
@FunctionalInterface
public interface LambdaTestInterface1 {
public void test();
}
@FunctionalInterface
interface LambdaTestInterface2 {
public void test(int a);
}
@FunctionalInterface
interface LambdaTestInterface3 {
public int test(int a, int b);
}
2단계: 람다식 사용, 비사용 비교
LambdaTestInterface1 lam1 = new LambdaTestInterface1() {
@Override
public void test() {
System.out.println("익명객체 구현 방식");
}
};
lam1.test();
lambdaTestInterface1 lam2 = () -> System.out.println("람다식짱!");
lam2.test();
3단계: 작성방법에 따른 생략정도 비교
LambdaTestInterface2 lam3 =
(int z) -> {
int result = z + 100;
System.out.println(result);
};
lam3.test(30);
LambdaTestInterface2 lam4 =
z -> {
int result = z + 300;
System.out.println(result);
};
lam4.test(60);
LambdaTestInterface2 lam5 =
z -> System.out.println(z + 500);
lam5.test(90);
LambdaTestInterface3 lam6 =
(int x, int y) -> {
int r = x + y;
return r;
};
int k = lam6.test(20,50);
LambdaTestInterface3 lam7 =
x, y -> {
return x + y ;
};
k = lam7.test(80, 50);
LambdaTestInterface3 lam8 =
(x, y) -> x + y;
k = lam8.test(100, 200);
LambdaTestInterface3 lam9 =
(x ,y) -> { return x > y ? x : y; };
k = lam9.test(100, 200);
람다식의 지역변수
- 람다식 내부에서 사용되는 지역변수는 모두 final이어야 한다.
- 보통은 final을 붙이지 않으면 컴파일러가 자동으로 붙여준다.
- 단, 지역변수의 값을 변경하는 식이 있을 경우에는 자동으로 final을 붙여주지 않는다.
예시 - T03_LambdaTest
public class T03_LambdaTest {
static int stVar = 9;
private String name = "홍길동";
public void testMethod(final int temp) {
final int localVar = 50;
int kor = 100;
kor = 400;
LambdaTestInterface1 lt =
() -> {
System.out.println("temp = " + temp);
System.out.println("localVar = " + localVar);
System.out.println("stVar = " + stVar);
System.out.println("name = " + this.name);
};
lt.test();
}
public static void main(String[] args) {
new T03_LambdaTest().testMethod(200);
}
}