본문 바로가기

게으른개발자/공부

자바 람다(Lambda)


람다란?

- 인스턴스보다 특정 기능(메소드)이 필요한 상황(아래의 코드를 예를 들자면 정렬을 위해 LenComp 인스턴스보다 compare 메소드의 기능이 필요한 상황)에서도  자바는 메소드만 전달 할수 없기때문에 인스턴스 생성이 불가피하다. 이런 상황에서 코드의 간결화를 가져다 줄수있는 기능이 람다이다.


- 함수형 인터페이스들은 모두 람다식을 이용해서 익명 구현 객체로 표현이 가능.

 


- 함수형 인터페이스 : 추상메소드가 딱 하나인 인터페이스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class LenComp implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
}
public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("int");
        list.add("double");
        list.add("float");
        Collections.sort(list, new LenComp());
    
        for(String s : list)
            System.out.println(s);
    }
}
cs




람다 사용 방법

( parameters ) -> expression body
( parameters ) -> { expression body }
() -> { expression body }
() -> expression body
...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface Printable {
    void print(String s);
}
 
class Test {
    public static void main(String[] args) {
    Printable p;
    p = (String s) -> { System.out.println(s);}; //줄임 없는 표현
    p.print("Lambda1");
 
    p = (String s) -> System.out.println(s); // 중괄호 생략
    p.print("Lambda2");
 
    p = (s) -> System.out.println(s);  //매개변수형 생략
    p.print("Lambda3");
 
    p = s -> System.out.println(s);  //매개변수 소괄호 생략
    p.print("Lambda4");
    }
}
cs


메소드가 둘 이상의 문장으로 이뤄져 있거나, 매개변수의 수가 둘 이상인 경우에는 각각 중괄호,소괄호 생략이 불가능. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface Calculate{
    int cal(int a, int b);
}
 
class Test {
    public static void main(String[] args) {
    Calculate c;
    c = (a,b) -> { return a+b}; //return문의 중괄호는 생략 불가!
    System.out.println(c.cal(4,3));
 
    c = (a,b) -> a+b; //연산 결과만 남으면 명시하지않아도 반환 대상이 됨
    System.out.println(c.cal(5,6));
    }
}
cs



참고 자료 : 윤성우의 열혈 Java