메서드를 하나의 식으로 표현한 것
int min(int x, int y) {
return x < y ? x : y;
}
(x, y) -> x < y ? x : y;
단 하나의 객체만을 생성할 수 있는 클래스
new Object() {
@Override
int min(int x, int y) {
return x < y ? x : y;
}
}
->
를 사용
(매개 변수 목록) -> { 함수 몸체 }
new Thread(new Runnable() {
public void run() {
System.out.println("전통적인 방식의 일회용 스레드 생성");
}
}).start();
new Thread(() -> {
System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();
()
를 생략할 수 있다.{}
를 생략할 수 있고, 이때 세미콜론 ;
은 붙이지 않는다.{}
를 생략할 수 없다.;
은 붙이지 않는다.람다 표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입
참조변수타입 참조변수이름 = 람다 표현식
@FunctionalInterface
어노테이션을 사용하여 명시할 수 있다.@FunctionalInterface
interface Calculator {
public int min(int x, int y);
}
public class Application {
public static void main(String[] args) {
Calculator minNum = (x, y) -> x < y ? x : y; // 추상 메서드 구현
System.out.println(minNum.min(3, 4); // 함수형 인터페이스 사용
}
}
java.util.function에 40여개의 자바 빌트인 함수형 인터페이스가 있다.
인터페이스명 | 추상 메서드 |
---|---|
Runnable | void run() |
Supplier<T> | T get() |
Consumer<T> | void accept() |
Predicate<T> | boolean test() |
Function<T, R> | R apply(T t) |
Comparator<T> | int compare(T o1, To2) |
함수형 인터페이스를 람다식이 아닌 일반 메서드를 참조시켜 선언하는 방법
람다 표현식이 단 하나의 메서드만을 호출하는 경우 불필요한 매개변수를 제거하고 ::
기호를 사용하여 표현할 수 있음
클래스이름::메서드이름
or
참조변수이름::메서드이름
// 람다 표현식
(base, exponent) -> Math.pow(base, exponent);
// 메서드 참조
Math::pow;
MyClass myClass = new MyClass();
Function<String, Boolean> function1 = (a) -> myClass.equals(a); // 람다 표현식
Fundtion<String, Boolean> function2 = myClass::equals(a); // 메서드 참조
// 단순히 객체를 생성하고 반환하는 람다 표현식
(a) -> { return new Object(a); }
// 생성자 참조
Object::new;
Function<Integer, double[]> function1 = a -> new double[a]; // 람다 표현식
Function<Integer, double[]> function2 = double[]::new; // 생성자 참조