자바의 정석을 통해 공부한 내용을 요약하였습니다.
1. 람다식이란?
- JDK1.8부터 추가되었다.
- 메서드를 하나의 '식(expression)'으로 표현한 것이다.
- 이름과 반환값이 없어 '익명 함수(anonymous function)'라고 한다.
메서드와 함수의 차이
- 메서드와 함수는 같은 의미
- 그러나 메서드는 클래스에 종속적, 함수는 클레스에 독립적
- 메서드는 객체지향개념 용어
람다식 작성하기
int max(int a, int b) {
return a > b ? a:b;
}
(a,b) -> a > b? a:b
- 이름과 반환타입을 제거하고 선언부와 {}사이에 '->'를 추가한다.
- 반환값이 있는 메서드는 return대신 식으로 대체하며 끝에 ';'를 붙이지 않는다.
- 매개변수는 대부분의 경우 생략할 수 있다.
- 매개변수가 하나일 경우 괄호를 생략 가능, 그러나 매개변수 타입이 있을 때는 생략 불가능하다.
- {} 안의 문장이 하나일 경우 {}생략 가능하며 끝에 ';'를 붙이지 않는다.
2. 함수형 인터페이스
(int a, int b) -> a > b ? a:b
new Object() {
int max(int a, int b){
return a > b ? a:b;
}
}
- 람다식은 익명 클래스의 객체와 동등하다.
- 참조변수가 있어야 객체의 메서드를 호출할 수 있다.(참조변수는 클래스 혹은 인터페이스가 가능하다.)
- 람다식을 다루기 위한 인터페이스를 '함수형 인터페이스(functional interface)'라고 한다.
@FunctionalInterface
interface MyFunction {
int max(int a, int b);
}
함수형 인터페이스 타입의 매개변수와 반환타입
@FunctionalInterface
interface MyFunction {
void myMethod();
}
void aMethod(MyFunction f) {
f.myMethod();
}
MyFunction getMyFuntion() {
MyFunction f = () -> {};
return f;
}
- 람다식을 참조변수로 다룰 수 있다는 것은 메서드를 통해 람다식을 주고받을 수 있다는 것을 의미한다.
- 사실상 메서드가 아니라 객체를 주고받는 것이여서 근본적으로 달라지는 것은 없다.
- 그러나 코드가 더 간결하고 이해하기 쉬워진다.
3. java.util.function 패키지
- 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해놓은 패키지이다.
java.lang.Runnalbe
- void run() - 매개변수도 없고 반환값도 없음
Supplier< T>
- T get() - 매개변수는 없고, 반환값만 있음
- 공급자 역할
Consumer< T>
- void accept(T t) - 매개변수만 있고, 반환값이 없음
- 소비자 역할
- Supplier와 반대
Function<T,R>
- R apply(T t) - 하나의 매개변수를 받아 결과를 반환
- 일반적인 함수
Predicate< T>
- boolean test(T t) - 하나의 매개변수를 받음, 반환타입은 boolean
- 조건식을 표현하는데 사용
Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "":
if(isEmptyStr.test(s))
System.out.println("This is an empty String");
3-1. 매개변수가 두 개인 함수형 인터페이스
- 매개변수의 개수가 2개인 함수형 인터페이스로 이름 앞에 접두사'Bi'가 붙는다.
BiConsumer<T,U>
- void accept(T t, U u) - 두개의 매개변수만 있고 반환값이 없음
BiPredicate<T,U>
- boolean test(T t, U u) - 매개변수는 둘, 반환값은 boolean
- 조건식을 표현하는데 사용
BiFunction<T,U,R>
- R apply<T t, U u> - 두개의 매개변수를 받아서 하나의 결과를 반환
@FunctionalInterface
interface TriFunction<T,U,V,R> {
R apply(T t, U u, V v);
}
- 3개 이상의 매개변수를 갖는 함수형 인터페이스가 필요할 시 위처럼 직접 만들어서 사용한다.
3-2. UnaryOperator & BinaryOperator
- 매개변수의 타입과 반환타입의 타입이 모두 일치한다.
UnaryOperator< T>
- T apply(T t) - 매개변수와 결과의 타입이 같다.
- Function의 자손
BinaryOperator< T>
- T apply(T t, T t) - 매개변수와 결과의 타입이 같다.
- BiFunction의 자손