함수형 인터페이스를 따로 정의하지 않고도 자바에서 기본으로 제공하는 함수형 인터페이스가 있다.
이를통해 람다 표현식, 메서드 레퍼런스, 생성자 레퍼런스를 사용해서 구현할 수 있는 함수형 인터페이스를 살펴보자.
자바에서 미리 정의해둔 자주 사용할만한 함수 인터페이스
Function<T, R>
T타입을받아서R타입을리턴하는함수인터페이스
import java.util.function.Function;
class Plus10 implements Function<Integer, Integer> {
@Override
public Integer apply(Integer integer) {
return integer + 10;
}
}
public class Foo {
public static void main(String[] args) {
// 방법 1
Plus10 plus10 = new Plus10();
System.out.println(plus10.apply(1));
// 방법 2, 람다 표현식을 사용하여 클래스 필요 없이 바로 구현 가능
Function<Integer, Integer> plus20 = (i) -> i + 20;
System.out.println(plus20.apply(1));
// 함수를 조합할 수 있는 메서드를 default 메서드로 제공한다.
// compose? x2 먼저 실행 후 +10 실행
Function<Integer, Integer> multiply2 = (i) -> i * 2;
Function<Integer, Integer> multiply2AndPlus10 = plus10.compose(multiply2);
System.out.println(multiply2AndPlus10.apply(2));
// andThen? +10 실행 후 x2 실행
Function<Integer, Integer> Plus10Andmultiply2 = plus10.andThen(multiply2);
System.out.println(Plus10Andmultiply2.apply(2));
}
}
BiFunction<T, U, R>
두개의값(T,U)를받아서R타입을리턴하는함수인터페이스
Consumer<T>
T 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스
import java.util.function.Consumer;
public class Foo {
public static void main(String[] args) {
// 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스
Consumer<Integer> printT = i -> System.out.println(i);
printT.accept(10);
}
}
Supplier<T>
T 타입의 값을 제공하는 함수 인터페이스
import java.util.function.Supplier;
public class Foo {
public static void main(String[] args) {
// 타입의 값을 제공하는 함수 인터페이스, 아무 값도 파라미터로 받지 않고 주기만 한다.
Supplier<Integer> get10 = () -> 10;
System.out.println(get10.get());
}
}
Predicate<T>
T 타입을 받아서 boolean을 리턴하는 함수 인터페이스
import java.util.function.Predicate;
public class Foo {
public static void main(String[] args) {
// 인자를 받아서 boolean을 리턴하는 함수 인터페이스
Predicate<String> startWithHK = (s) -> s.startsWith("s");
}
}
UnaryOperator<T>
Function<T, R>의 특수한 형태로, 입력값 하나를 받아서 동일한 타입을 리턴하는 함수 인터페이스
import java.util.function.UnaryOperator;
public class Foo {
public static void main(String[] args) {
// 입력 타입과 리턴 타입이 같으면 UnaryOperator 를 사용할 수 있다.
// Function<Integer, Integer> 할 필요가 없다.
UnaryOperator<Integer> plus30 = (i) -> i + 20;
}
}
BinaryOperator<T>
BiFunction<T, U, R>의 특수한 형태로, 동일한 타입의 입렵값 두개를 받아 리턴하는 함수 인터페이스
import java.util.function.BinaryOperator;
public class Foo {
public static void main(String[] args) {
// BiFunction 에 특수한 형태로, 세개의 타입이 모두 같은경우 쓰일수 있다는 것이다.
BinaryOperator<Integer> test = (a,b) -> a + b + 20;
}
}
이 처럼 Java 가 제공해주는 함수형 인터페이스를 이용하여 새로운 함수형 인터페이스를 사용하지 않고도 작업이 가능하다.
위 항목 외에도 많은 함수형 인터페이스를 제공하니 필요할 때 마다 찾아쓰면 된다.
참고
자바가 제공해주는 함수형 인터페이스
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
백기선 - 더 자바, Java8
https://www.inflearn.com/course/the-java-java8/dashboard
'프로그래밍 > Java' 카테고리의 다른 글
인터페이스 default 메소드와 static 메소드 (0) | 2022.06.09 |
---|---|
메소드 레퍼런스 (0) | 2022.06.08 |
함수형 인터페이스와 람다 표현식 소개 (0) | 2022.06.07 |
Metaspace (0) | 2022.05.06 |
배열 Parallel 정렬 (0) | 2022.05.06 |