JAVA 공부일기1-15
Java의 정석 기초편
Chapter14 람다와 스트림
1. 람다식
메서드를 하나의 식으로 표현한 것. 메서드를 람다식으로 표현하면 이름과 반환값이 없어지므로 익명함수라 부름.
자바에서 모든 메서드는 클래스 내에 포함되어야 하므로 사실 람다식은 익명 클래스의 객체와 동등하다.
*함수와 메서드의 차이: 근본적으로 동일. 함수는 일반적 용어, 메소드는 객체지향적 개념. 함수는 클래스에 독립적, 메소드는 클래스에 종속적. 람다식이 함수형 언어에서 왔기 때문에 용어 혼용되어 사용.
람다식 작성법
방법 | 메서드 | 람다식 |
메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통 사이에 '->' 추가 | int max(int a, int b){ return a>b ? a : b; } |
(int a, int b) -> { return a>b ? a : b; } |
반환값이 있는 메서드는 return문 대신 식으로 대체 가능. | int max(int a, int b){ return a>b ? a : b; } |
(int a, int b) -> a>b ? a : b |
람다식에 선언된 매개변수의 타입이 추론 가능할 경우 생략 가능. | int max(int a, int b){ return a>b ? a : b; } |
(a, b) -> a>b ? a : b |
매개변수가 하나일때 괄호() 생략 가능. | int square(int x) { return x * x; } |
x -> x * x |
2. 함수형 인터페이스
람다식을 다루기 위한 인터페이스로, 함수형 인터페이스는 오직 하나의 추상메서드만 정의되어야 함.(람다식과 인터페이스의 메서드가 1:1로 연결되기 때문)
@FunctionInterface: 함수형 인터페이스에 붙이는 어노테이션. 없어도 되지만 붙이면 문법 오류가 없는지 검증해줌.
함수형 인터페이스 타입의 매개변수, 반환타입
메서드의 매개변수의 타입이 함수형 인터페이스인 경우: 해당 메서드를 호출할 때 람다식을 참조하는 참조변수를 매개변수로 지정 or 참조변수 없이 람다식을 매개변수로 지정.
매서드의 반환타입이 함수형 인터페이스인 경우: 함수형 인터페이스의 추상메서드와 동등한 람다식을 가리키는 참조변수를 반환 or 람다식 직접 반환.
3. java.util.function패키지
대부분의 메서드는 타입이 비슷하므로 java.util.function패키지에 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의되어 있음. 재사용과 유지보수↑
*타입문자 T는 Type을, R은 ReturnType을 의미.
4. 메서드 참조
하나의 메서드만 호출하는 람다식은 'ClassName::method'로 더 간단히 바꿀 수 있음.
Function<String, Integer> f = (String s) -> Integer.parseInt(s); //람다식
Function<String, Integer> f = Integer::pareseInt; //메서드 참조
생성자를 호출하는 람다식도 메서드 참조로 변환 가능.
Supplier<MyClass> s = () -> new MyClass(); //람다식
Supplier<MyClass> s = MyClass::new; //메서드 참조