[람다와 스트림]Lambda & Stream

JONGCHAN SEO·2023년 12월 10일

자바 기본

목록 보기
1/10

람다(Lambda)란?

  • 함수를 간단한 '식(expression)' 으로 표현하는 방법
//변환 전
int max(int a,int b) {
	return a > b ? a : b
//변환 후
(a, b) -> a > b ? a : b

람다식 작성할때 주의사항

  • 매개변수가 하나인 경우, 괄호() 생략가능
  • 블록 안의 문장이 하나뿐일 때, 괄호{} 생략가능( ' ; ' 세미콜론 포함)
  • 단 하나뿐인 문장이 return문이면 괄호{} 생략불가(' ; '세미콜론 포함)

람다식은 익명 함수? 익명 객체?

람다식은 함수인지 객체인지 헷갈릴 수 있지만, 익명 클래스의 객체이다.

(a, b) -> a > b ? a : b //람다식
-> new Object() {
	int max(int a,int b) {
    	return a > b ? a : b;

함수형 인터페이스(Functional Interface)

위의 식을 기준으로 람다식으로 정의된 익명 객체의 메서드를 어떻게 호출 할 것인가?를 위하여 익명 객체의 주소를 f라는 참조 변수에 저장한다.

MyFuntion f = new MyFuntion() {
				 public int max(int a, int b){
                 		return a > b ? a : b;
int bing = f.max(5, 3); 
// 익명 객체의 메서드를 호출

위의 MyFuntion인터페이스에 정의된 메서드 max()를 람다식으로 표현할수 있기에 바꿔주면 아래와 같이 할 수 있다.

MyFuntion f = (int a, int b) -> a > b ? a : b; 
// 익명 객체를 람다식으로 대체
int big = f.max(5, 3);

함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 하는 제약이 있다. 그래야만, 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다. static메서드와 default메서드의 개수에는 제약이 없다.

@FunctionalInterface 
//@FunctionalInterface를 붙이면, 
//컴파일러가 함수형 인터페이스를 올바르게 정의하였는지 확인해준다.
interface MyFunction { //추상 메서드는 1개만 가능 
	public abstract int max(int a, int b);

함수형 인터페이스 타입의 매개변수와 반환타입

메서드의 매개변수가 MyFunction타입이면, 메서드를 호출할 때
"람다식을 참조하는 참조변수를 매개변수"로 지정해야한다.

@FunctionallInterface
interface MyFunction{
	void myMethod(); //추상 메서드  public abstract void myMethod();
}


void aMethod(MyFunction f){ //매개변수의 타입이 함수형 인터페이스
	f.MyMethod(); //MyFinction에 정의된 메소드 호출
    }
    ~~~(생략)
    MyFunction f = return ()->{};
    
 
aMehod(()-> System.out.println("MyMethod()")); //람다식을 매개변수로 지정

람다식의 타입과 형변환
함수형 인터페이스로 람다식을 참조할 수 있는 것일 뿐,
람다식의 타입과 함수형 인터페이스의 타입이 일치하는 것은 아니다.

MyFunction f = (MyFunction)(() -> {});
//양변의 타입이 다르므로 형변환이 필요, 생략가능
profile
잘 배워가겠습니다.

0개의 댓글