Do It Java Day31
내부 클래스, 람다식, 스트림 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");
}
}