English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
함수형 인터페이스(Functional Interface)은 하나의 추상 메서드를 가지고 있으며, 여러 개의 비 추상 메서드를 가질 수 있는 인터페이스입니다.
함수형 인터페이스는 lambda 표현식으로 익히 될 수 있습니다.
Lambda 표현식과 메서드 참조(실제로는 Lambda 표현식으로 간주할 수 있습니다)에서 사용됩니다.
예를 들어 다음과 같은 함수형 인터페이스를 정의했습니다:
@FunctionalInterface interface GreetingService { void sayMessage(String message); }
그런 다음 Lambda 표현식을 사용하여 이 인터페이스의 하나의 구현을 표현할 수 있습니다(주의: JAVA 8 이전에는 일반적으로 익명 클래스로 구현되었습니다):
GreetingService greetService1 message -> System.out.println("Hello ") + message);
함수형 인터페이스는 기존 함수를 람다와 잘 맞춤으로 지원합니다.
JDK 1.8 이전에 존재하는 함수형 인터페이스:
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
JDK 1.8 새로 추가된 함수 인터페이스:
java.util.function
java.util.function 이는 Java의 함수형 프로그래밍을 지원하기 위해 많은 클래스를 포함하고 있으며, 이 패키지의 함수형 인터페이스는 다음과 같습니다:
순번 | 인터페이스 & 설명 |
---|---|
1 | BiConsumer<T,U> 두 입력 파라미터를 받는 작업을 대표하며 어떠한 결과도 반환하지 않음 |
2 | BiFunction<T,U,R> 두 입력 파라미터를 받는 메서드를 대표하며 결과를 반환 |
3 | BinaryOperator<T> 두 동일한 타입의 연산자에 대해 작업을 수행하며 동일한 타입의 결과를 반환 |
4 | BiPredicate<T,U> 두 파라미터를 가진 boolean 메서드를 대표 |
5 | BooleanSupplier boolean 값 결과를 제공하는 대상 |
6 | Consumer<T> 입력 파라미터를 받는 작업을 대표하며 결과를 반환하지 않음 |
7 | DoubleBinaryOperator 두 double 값에 대한 연산자를 대표하며 double 값 결과를 반환 |
8 | DoubleConsumer double 값 파라미터를 받는 작업을 대표하며 결과를 반환하지 않음 |
9 | DoubleFunction<R> double 값 파라미터를 받는 메서드를 대표하며 결과를 반환 |
10 | DoublePredicate double 값 파라미터를 가진 boolean 메서드를 대표 |
11 | DoubleSupplier double 값 구조를 제공하는 대상 |
12 | DoubleToIntFunction double 타입의 입력을 받아 int 타입의 결과를 반환합니다. |
13 | DoubleToLongFunction double 타입의 입력을 받아 long 타입의 결과를 반환합니다. |
14 | DoubleUnaryOperator 매개변수와 반환 값이 모두 double 타입인 경우를 받아들입니다. |
15 | Function<T,R> 입력 매개변수를 받아 결과를 반환합니다. |
16 | IntBinaryOperator 두 매개변수가 모두 int 타입이며, 반환 값도 int 타입인 경우를 받아들입니다. |
17 | IntConsumer int 타입의 입력 매개변수를 받아 반환 값이 없습니다. |
18 | IntFunction<R> int 타입의 입력 매개변수를 받아 결과를 반환합니다. |
19 | IntPredicate int 입력 매개변수를 받아 boolean 타입의 결과를 반환합니다. |
20 | IntSupplier 매개변수가 없으며, 결과 값이 int 타입입니다. |
21 | IntToDoubleFunction int 타입의 입력을 받아 double 타입의 결과를 반환합니다. |
22 | IntToLongFunction int 타입의 입력을 받아 long 타입의 결과를 반환합니다. |
23 | IntUnaryOperator 매개변수와 반환 값이 모두 int 타입인 경우를 받아들입니다. |
24 | LongBinaryOperator 두 매개변수가 모두 long 타입이며, 반환 값도 long 타입인 경우를 받아들입니다. |
25 | LongConsumer long 타입의 입력 매개변수를 받아 반환 값이 없습니다. |
26 | LongFunction<R> long 타입의 입력 매개변수를 받아 결과를 반환합니다. |
27 | LongPredicate long 입력 매개변수를 받아 boolean 타입의 결과를 반환합니다. |
28 | LongSupplier 매개변수가 없으며, 결과 값이 long 타입입니다. |
29 | LongToDoubleFunction long 타입의 입력을 받아 double 타입의 결과를 반환합니다. |
30 | LongToIntFunction long 타입의 입력을 받아 int 타입의 결과를 반환합니다. |
31 | LongUnaryOperator 매개변수와 반환 값이 모두 long 타입인 경우를 받아들입니다. |
32 | ObjDoubleConsumer<T> Object 타입과 double 타입의 입력 매개변수를 받아들여, 반환 값이 없습니다. |
33 | ObjIntConsumer<T> Object 타입과 int 타입의 입력 매개변수를 받아들여, 반환 값이 없습니다. |
34 | ObjLongConsumer<T> object 타입과 long 타입의 입력 매개변수를 받아 결과를 반환하지 않습니다. |
35 | Predicate<T> 입력 매개변수를 받아 boolean 값을 반환합니다. |
36 | Supplier<T> 매개변수 없이 결과를 반환합니다. |
37 | ToDoubleBiFunction<T,U> 두 입력 매개변수를 받아 double 타입 결과를 반환합니다 |
38 | ToDoubleFunction<T> 입력 매개변수를 받아 double 타입 결과를 반환합니다 |
39 | ToIntBiFunction<T,U> 두 입력 매개변수를 받아 int 타입 결과를 반환합니다. |
40 | ToIntFunction<T> 입력 매개변수를 받아 int 타입 결과를 반환합니다. |
41 | ToLongBiFunction<T,U> 두 입력 매개변수를 받아 long 타입 결과를 반환합니다. |
42 | ToLongFunction<T> 입력 매개변수를 받아 long 타입 결과를 반환합니다. |
43 | UnaryOperator<T> 매개변수 타입 T를 받고, 반환 타입도 T인 경우 |
Predicate <T> 인터페이스는 함수형 인터페이스로, 입력 매개변수 T를 받아布尔 값을 반환합니다.
이 인터페이스는 Predicate를 다른 복잡한 논리(예: AND, OR, NOT)로 조합하는 여러 가지 기본 메서드를 포함하고 있습니다.
이 인터페이스는 객체가 true나 false인지 테스트하는 데 사용됩니다.
다음 예제(Java8Tester.java)에서 함수형 인터페이스 Predicate <T>의 사용을 이해할 수 있습니다:
import java.util.Arrays; import java.util.List; import java.util.function.Predicate; public class Java8Tester { public static void main(String args[]){ List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // Predicate<Integer> predicate = n -> true // n은 Predicate 인터페이스의 test 메서드에 전달된 매개변수입니다 // n이 존재하면 test 메서드가 true를 반환합니다 System.out.println("출력 모든 데이터:"); // n 매개변수를 전달합니다 eval(list, n->true); // Predicate<Integer> predicate1 = n -> n%2 == 0 // n은 Predicate 인터페이스의 test 메서드에 전달된 매개변수입니다 // n%2 0 test 메서드가 true를 반환합니다 System.out.println("출력 모든 짝수:"); eval(list, n-> n%2 == 0 ); // Predicate<Integer> predicate2 = n -> n > 3 // n은 Predicate 인터페이스의 test 메서드에 전달된 매개변수입니다 // n이 더 크다면 3 test 메서드가 true를 반환 System.out.println("출력 값이 큰 3 의 모든 숫자:"); eval(list, n-> n > 3 ); } public static void eval(List<Integer> list, Predicate<Integer> predicate) { for(Integer n: list) { if(predicate.test(n)) { System.out.println(n + " "); } } } }
위 스크립트 실행 결과를 출력합니다:
$ javac Java8Tester.java $ java Java8Tester 출력 모든 데이터: 1 2 3 4 5 6 7 8 9 출력 모든 짝수: 2 4 6 8 출력 값이 큰 3 의 모든 숫자: 4 5 6 7 8 9