내부 클래스, 람다식, 스트림 2

1. 람다식(lambda expression)

  • 자바에서 함수형 프로그래밍을 구현하는 방식
  • 자바8부터 지원
  • 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행

함수형 프로그래밍

  • 순수 함수(pure function)를 구현하고 호출함으로써 외부 자료에 영향을 주지 않고 매개 변수만을 사용하도록 만든 함수
  • 동일한 매개 변수가 들어오면 항상 동일한 결과를 리턴
  • 병렬처리 가능
  • 안정적이고 확장성 있는 프로그래밍 방식

람다식 구현하기

  • 익명 함수 만들기
  • 매개 변수와 매개 변수를 활용한 실행문으로 구현
  • 함수 이름, 반환 형을 없애고 ->를 사용
  • {} 까지 실행문을 의미
//원래 메서드
int add(int x, int y){
	retrun x + y;
}

//람다식
(int x, int y) -> {return x + y;}

람다식 문법

  • 매개변수가 하나인 경우 자료형과 괄호 생략하기
str -> {System.out.println(str);}
//x, y -> {System.out.println(x, y);} //매개변수가 두 개면 괄호 생략 불가!
  • 구현부가 한 문장인 경우 중괄호 생략(retrun이 있으면 return까지 생략해야 함)
str -> System.out.println(str);
//(x, y) -> return x + y; //retrun이 있으면 return까지 생략해야 함
(x, y) -> x + y;

함수형 인터페이스

  • 람다식을 선언하기 위한 인터페이스
  • 익명 함수와 매개 변수만으로 구현되므로 단 하나의 메서드만을 가져야함
  • @FunctionalInterface 애노테이션을 통해 함수형 인터페이스를 표시할 수 있다

예시

@FunctionalInterface //함수형 인터페이스(추상 메서드를 하나만 가진다!)
public interface MyNumber {
	int getMaxNumber(int num1, int num2);
}
public class TestMyNumber {
	public static void main(String[] args) {
		MyNumber maxNum = (x, y) -> (x >= y)? x : y;
		int max = maxNum.getMaxNumber(10, 20);
		System.out.println(max);
	}
}

익명 객체를 생성하는 람다식

  • 자바는 객체 지향 언어로 객체를 생성해야 메서드가 호출된다
  • 람다식으로 메서드를 구현하고 호출하면 내부에서 익명 클래스가 생성된다
  • 람다식에서 외부 메서드의 지역변수는 상수로 처리된다(지역 내부 클래스와 동일)
//익명 클래스
MyNumber maxNum1 = new MyNumber() {
	@Override
	public int getMaxNumber(int x, int y) {
		return (x >= y)? x : y;
	}
};

//람다식
MyNumber maxNum2 = (x, y) -> (x >= y)? x : y;

함수를 변수처럼 사용하는 람다식 예시

//함수형 인터페이스
interface PrintString{
	void showString(String str);
}

public class LambdaTest {
	public static void main(String[] args) {
        //일반적인 람다식
		PrintString lambdaPrint = str -> System.out.println(str);
		lambdaPrint.showString("test"); //test
		
        //람다식으로 구현한 함수 자체가 매개변수로 넘어간다
		showMyString(lambdaPrint); //test2 
		
        //구현부를 리턴한다
		PrintString reStr = returnPrint();
		reStr.showString("hello");//hello world 
	}
	
    //람다식으로 구현한 함수 자체가 매개변수로 넘어간다
	public static void showMyString(PrintString lambda) {
		lambda.showString("test2");
	}
	
    //구현부를 리턴한다
	public static PrintString returnPrint() {
		return s -> System.out.println(s + " world");
	}
}

태그:

카테고리:

업데이트: