Language/Java
함수형 인터페이스
Jinn
2024. 1. 7. 00:25
단 하나의 추상 메서드만 선언된 인터페이스.
// 함수형 인터페이스
@FunctionalInterface
interface AddNumber {
int add(int x, int y);
}
// 익명 클래스
AddNumber addNumber1 = new AddNumber() {
public int add(int x, int y) {
return x + y;
}
}
// 람다식 (함수형 인터페이스 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야 함)
AddNumber addNumber2 = (x, y) -> x + y;
int result1 = addNumber1.add(5, 10); // 15
int result2 = addNumber2.add(5, 10); // 15
자바에서 람다식은 익명객체이므로 람다식을 다루려면 참조변수(addNumber2)가 필요한데 이때 참조변수의 타입을 함수형 인터페이스로 사용한다. 람다식을 호출하기 위해서 함수형 인터페이스의 추상 메서드 이름(add)을 사용한다.
java.util.function 패키지에 이미 정의된 함수형 인터페이스가 있다.
- Function<T, R>
Function<String, Integer> f = s -> Integer.parseInt(s);
// Fucntion<String, Integer> f = Integer::parseInt;
System.out.println(f.apply("3")); // 3(Integer)
Function 함수형 인터페이스는 한 개를 input 받고 한 개를 return 한다.
- Consumer<T>
Consumer<Integer> c = i -> System.out.println(i);
// Consumer<Integer> c = System.out::println;
c.accept(3); // 3
Consumer 함수형 인터페이스는 한 개를 input 받고 아무것도 return 하지 않는다.
- Supplier<T>
Supplier<Integer> s = () -> 3;
System.out.println(s.get()); // 3
Supplier 함수형 인터페이스는 input 받지 않고 return 한다.
- Predicate<T>
Predicate<String> p = s -> s.startsWith("a");
System.out.println(p.test("abc")); // true
Predicate 함수형 인터페이스는 한 개를 input 받아서 boolean 타입을 return 한다.
- UnaryOperator<T>
UnaryOperator<Integer> u = i -> i * 2;
System.out.println(u.apply(5)); // 10
UnaryOperator 함수형 인터페이스는 Function과 기능은 동일하지만 input과 return의 타입이 일치할 때 사용한다.
이외에도 BiFunction<T, U, R>, BinaryOperator<T> 등 여러 함수형 인터페이스가 java.util.function 패키지에 정의되어 있다.