카테고리 없음

[JAVA] 람다식

미니시리 2024. 5. 5. 23:07

람다식은 JDK 1.8부터 추가된 것으로 메서드를 하나의 식으로 표현한 것이다. 람다식을 사용함으로써 코드가 간결해지고 또한 가독성이 증가되는 여러 이점등이 있다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 람다식을 익명함수 라고도 한다.

특징

  1. 익명
    - 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다.- 구현해야 할 코드에 대한 걱정거리가 줄어듬
  2. 함수
    - 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 불린다.
    - 메서드처럼 파라미터 리스트, 바디, 반환형식, 가능한 예외 리스트를 포함한다.
  3. 전달
    - 람다 표현식을 메서드 인수로 전달하거나 변수로 저장 할 수 있다.
  4. 간결성
    - 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다.

 

//람다식을 적용하기 전 코드
Comparator<String> s = new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
}

//람다식을 적용
Comparator<String> s = (String s1, String s2) -> s1.compareTo(s2));

 

사용법

// 메서드
반환타입 메서드이름(매개변수 선언){
	문장들
}
// ex
int max(int a, int b){
	return a> b ? a: b;
}


// 람다식
(매개변수 선언) -> {
	문장들
}
// ex
(int a, int b) -> { return a > b ? a: b; }

 

표현 방법

1. 반환값이 있는 메서드의 경우, return문 대식 '식(expression)'으로 대신 할 수 있다. 식의 연산결과가 자동적으로 반환 값이 되며 '문장(statement)'이 아닌 식이므로 끝에 세미콜론(;)을 붙이지 않는다.

(int a, int b) -> { return a > b ? a : b; } // return문
(int a, int b) -> a > b ? a : b             // 식(expression)

 

2. 람다식에 선언된 매개변수의 타입은 추론이 가능한 경우에 생략이 가능하다. 대부분의 경우 생략이 가능하며 람다식에 람다식에 반환타입이 없는 이유도 항상 추론이 가능하기 때문이다. 단, 두 매개변수 중 어느 하나의 타입만 생략하는 것은 허용되지 않는다.

(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? a : b   // 매개변수의 타입 생략

 

3. 선언된 매개변수가 하나뿐인 경우에는 괄호()를 생략할 수 있다. 단, 매개변수의 타입이 있으면 생략할 수 없다.

a -> a * a      // Ok.
int a -> a * a  // error.
(int a) -> a * a // Ok.

 

4. 괄호{} 안의 문장이 하나일 때는 역시 괄호{}를 생략할 수 있다. 이 때 문장의 끝에 세미콜론(;)를 붙이지 않아야 한다

(String name, int i) -> {
    System.out.println(name + " = " + i);
}

(String name, int i) ->
    System.out.println(name + " = " + i)

 

5. 괄호{} 안의 문장이 return문일 경우 괄호{}를 생략할 수 없다.

(int a, int b) -> { return a > b ? a : b; } // return문 Ok.
(int a, int b) ->   return a > b ? a : b    // return문 error.
(int a, int b) ->   a > b ? a : b           // 식(expression)