quilt code

[고급자바] 람다 본문

daily/고급자바

[고급자바] 람다

김뱅쇼 2023. 2. 14. 18:50

1. 람다

 


람다 : 익명함수를 생성하기 위한 식. 자바에서는 '매개변수를 가진 코드 블럭' => 런타임시 익명구현 객체로 생성된다.


형식) 인터페이스명 객체변수명 = 람다식;
람다식의 형식) (매개변수들...) -> { 처리할 코드들; ... }


람다식으로 변환할 수 있는 인터페이스는 추상메소드가 1개인 인터페이스만 처리할 수 있다.
이런 인터페이스를 '함수적 인터페이스'라고 한다.
이 함수적 인터페이스를 만들 때는 @FunctionalInterface로 지정한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public static void main(String[] args) {
        
        // 람다식을 사용하지 않는 경우
        Thread th1 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                for(int i=1; i<=10; i++) {
                    System.out.println(i);
                }
                
            }
        });
        
        th1.start();
        
        // 람다식을 사용하는 경우
        Thread th2 = new Thread(
            ()->{
                for(int i=1; i<=10; i++) {
                    System.out.println("람다 - " + i);
                }    
            }
        );
        th2.start();
                
    } 
cs

 

2. 람다식 작성 방법

 


람다식 작성 방법
기본형식) (자료형 이름 매개변수명, ...) -> { 실행문들; ... }


1) 매개변수의 '자료형 이름'은 생략할 수 있다.

예) (int a) -> { System.out.println(a);}
        (a)    -> { System.out.println(a);}

2) 매개변수가 1개일 경우에는 괄호 '( )'를 생략할 수 있다.

예) a -> { System.out.println(a);}

3) '실행문'이 1개일 경우에는 ' { } '를 생략할 수 있다.
    (이때, 문장의 끝을 나타내는 세미콜론(;)도 생략한다.)

예) a -> System.out.println(a);


4) 매개변수가 하나도 없으면 괄호 '( )'를 생략할 수 있다.

예) (  ) -> System.out.println("안녕");

5) 반환값이 있을 경우에는 return 명령을 사용한다.

예) (a, b) -> { return a+b;}
      (a, b) -> return a+b

6) 실행문에 return문만 있을 경우 return명령과 '{ }'를 생략할 수 있다. 

예) (a, b) -> a + b

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package kr.or.ddit.basic;
 
public class T02LambdaTest {
    public static void main(String[] args) {
        
        // 람다식을 사용하지 않았을 경우...
        LambdaTestInterface1 lam1 = new LambdaTestInterface1() {
            
            @Override
            public void test() {
                System.out.println("안녕하세요.");
                System.out.println("익명 구현 객체 방식입니다.");
                
            }
        };
        lam1.test();  // 메소드 호출 
        
        // 람다식을 사용했을 때...
        LambdaTestInterface1 lam2 = 
                () -> System.out.println("반갑습니다.\n람다식으로 처리하는 방식입니다.");  // ;생략 못하는 이유?  lam2.test랑 구분하기 위해
        lam2.test();  // 메소드 호출 
        
        
        
        /* Consumer<Integer> lam3 =
                (Integer z) -> {
                    int result = z + 100;
                     System.out.println("result = " + result);
                 };
                 
        lam3.accept(30);*/
        
        LambdaTestInterface2 lam3 = 
                 (int z) -> {
                     int result = z + 100;
                     System.out.println("result = " + result);
                 };
                 
        lam3.test(30);
         
        LambdaTestInterface2 lam4 =
                 z -> {
                     int result = z + 300;
                     System.out.println("result = " + result);
                 };
        lam4.test(60);
         
        LambdaTestInterface2 lam5 = 
                 z -> System.out.println("result = " + (z+50));
        lam5.test(90);
         
        System.out.println("----------------------------------------");
         
        /* BiFunction<Integer, Integer, Integer> lam 6 = 
                (Integer x, Integer y) -> {
                    int r = x + y;
                    return r;
                };*/
                
        LambdaTestInterface3 lam6 = 
                 (int x, int y) -> {
                     int r = x + y;
                     return r;
                 };
        int k = lam6.test(2050);
        System.out.println("k = " + k);
        
        LambdaTestInterface3 lam7 =
                (x, y) -> {
                    return x + y;
                };
        k = lam7.test(8050);
        System.out.println("k = " + k);
        
        LambdaTestInterface3 lam8 = 
                (x, y) -> x + y;
        k = lam8.test(100200);
        System.out.println("k = " + k);
        
        LambdaTestInterface3 lam9 =
                (x, y) -> x > y ? x : y;
        k = lam9.test(100200);
        System.out.println("k = " + k);
                
        
    }
 
}
cs

 

**

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package kr.or.ddit.basic;
 
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
 
public class T03LambdaTest {
    public static void main(String[] args) {
        
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        
        for(Integer i : list) {
            System.out.println();
        }
        System.out.println();
        
        list.forEach(new Consumer<Integer>( ) {
            
            @Override
            public void accept(Integer t) {
                System.out.println(t + 100);
            }
        });
        
        list.forEach(a -> System.out.println(a + 100));
        
        }
 
}
cs

'daily > 고급자바' 카테고리의 다른 글

[고급자바] IO (4)  (0) 2023.02.14
[고급자바] IO (3)  (0) 2023.02.13
[고급자바] IO (2)  (0) 2023.02.13
[고급자바] IO (1)  (0) 2023.02.13
[고급자바] Thread(6)  (0) 2023.02.13