본문 바로가기
JAVA

[JAVA] 람다식(Lambda Expression)

by 주옹스 2020. 8. 25.

람다식(Lambda Expression) 이란?

    - 람다식은 메소드를 하나의 식으로 표현한 것

    - 객체지향보다는 함수지향언어

    - 메소드를 간략하면서도 명확한 식으로 표현할 수 있도록 해준다.

    - 메소드를 람다식으로 표현하면 메소드의 이름 및 반환 값이 없어지므로 익명함수 라고 함.

    - 람다식의 형태는 매개 변수를 가진 코드 블록이지만 런타임 시에는 익명 구현 객체를 생성

    - 하나의 추상 메소드를 가진 인터페이스람다식 사용이 가능!

   

스레드의 추상메소드 람다식 표현.

 

 

 

 

 

 

 

람다식 작성 형식

람다식 작성 형식

 

 

 

 

 

Ex 1) 리턴타입이 void이며 파라미터가 없는 람다식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package ex0825;
 
public class Lambda {
    public static void main(String[] args) {
        //리턴타입이 void이며 파라미터가 없는 람다식
        User2 obj = ()-> {System.out.println("안녕");}; 
        //User2 obj = ()-> System.out.println("안녕");  ==> 식이 한줄일 때, {}생략가능.
        obj.write();
    }
}
 
interface User2{
    public void write();
}
cs

 

 

Ex 2) 리턴타입이 void이며 파라미터가 1개인 람다식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package ex0825;
 
public class Lambda2 {
    public static void main(String[] args) {
        
        //매개변수 1개, 리턴타입 void 람다식 ==> 1) , 2), 3) 모두 같은 결과.
        // 1) User3 obj = (int a) -> {int n = a+10; System.out.println(n);};
        // 2) User3 obj = (a) -> {int n = a+10; System.out.println(n);};   ==> 괄호안에 타입안써주면 알아서 인식해줌
         User3 obj = a -> {int n = a+10System.out.println(n);};   //==> 매개변수 하나이면 괄호생략가능
        
        obj.sub(5);
    }
}
 
@FunctionalInterface //람다가 가능하지 않는 경우 오류
interface User3{
    public void sub(int a);
}
cs

 

 

 

Ex 3) 리턴타입이 int이며 파라미터가 2개인 람다식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package ex0825;
 
public class Lambda3 {
    public static void main(String[] args) {
        
        //매개변수 2개, 리턴타입 int인 람다식 ==> 아래 모두 같은결과
        
        // 1) User4 u = (a,b) -> {int c = a+b; return c;};
        // 2) User4 u = (a,b) -> {return a+b;};
        User4 u = (a,b) -> a+b;
        
        System.out.println(u.add(105));
    }
}
 
@FunctionalInterface //람다가 가능하지 않는 경우 오류
interface User4{
    public int add(int a, int b);
}
cs

 

 

 

 

람다식 기본 문법

 

 

 

 

 

 

람다식 Consumer EX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package ex0825;
 
import java.util.function.Consumer;
import java.util.function.IntSupplier;
 
public class Consumer_ex1 {
    public static void main(String[] args) {
        Consumer<Long> c = (t) -> System.out.println(t);
        c.accept(100L);
        
        IntSupplier i = () -> (int)(Math.random()*100)+1;
        System.out.println(i.getAsInt());
    }
}
 
 
cs

 

 

 

람다식 Runnable EX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package ex0825;
 
import java.util.Calendar;
 
public class Runnable_Rambda1 {
    public static void main(String[] args) {
        // 1초에 한번씩 시간나오게
        Runnable r = () -> {
            while (true) {
                String s = String.format("%tT", Calendar.getInstance());
                System.out.println(s);
 
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                }
            }
 
        };
        Thread t = new Thread(r);
        t.start();
    }
}
 
cs

 

 

 

 

 

메소드 참조(Method Reference)란 ?

 

- 메소드 참조는 메소드를 간결하게 지칭할 수 있는 방법으로 람다식이 하나의 메소드만 호출하는 경우

  메소드 참조를 이용하여 람다식을 간략히 할 수 있다.

 

- 이미 존재하는 이름을 가진 메소드를 람다로써 사용할 수 있도록 참조하는 역할을 한다.

 

- 메소드 참조는 메소드를 참조해서 매개변수의 정보 및 리턴타입을 알아내어, 람다식에 불필요한

  매개 변수를 제거하는 것이 목적이다.

 

- 메소드 참조는 메소드명 앞에 구분자(::)를 붙이는 방식으로 사용.

 

 

 

1. 생성자의 메소드 참조

 

생성자 메소드 참조

 

 

 

 

 

2. static의 메소드 참조

 

static 메소드 참조

 

 

 

 

 

3. instance 메소드 참조

 

instance메소드 참조

 

 

 

 

 

 

Ex1 )

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
package ex0825;
 
public class Lambda4 {
    public static void main(String[] args) {
        
        //정수를 문자열로
        User5 u1 = (n)->{return String.valueOf(n);};
        User5 u2 =  (n)->String.valueOf(n);
        User5 u3 = String::valueOf;
        
        System.out.println(u1.convert(10));
        System.out.println(u2.convert(10));
        System.out.println(u3.convert(10));
        
    
        String s = sub(10,u2);
        System.out.println(s);
    }
    
    public static String sub(Integer num, User5 u) {
        return u.convert(num);
    }
}
 
@FunctionalInterface //람다가 가능하지 않는 경우 오류
interface User5{
    public String convert(Integer n);
}
 
 
cs

 

Ex2 )

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
package ex0825;
 
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;
 
public class Stream_ex1 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("자바""오라클""웹");
        
        //컬렉션 예
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.print(s + " ");
        }
        System.out.println();
        
        //스트림 예
        Stream<String> st = list.stream();
        //st.forEach(s->System.out.println(s)); //람다식
        st.forEach(System.out::print); //static 메소드 참조
        System.out.println();
        
    
    }
}
 
cs

'JAVA' 카테고리의 다른 글

[JAVA] 어노테이션(Annotation)  (0) 2020.08.25
[ JAVA ] Thread  (0) 2020.08.20
[JAVA] 파일처리 예시  (0) 2020.08.18
[JAVA] 입출력 스트림 (I/O Stream)  (0) 2020.08.18
[JAVA] 생성자  (4) 2020.08.11