Java의 기능적 인터페이스는 하나의 추상 메소드만 포함하는 인터페이스입니다. 기능적 인터페이스에는 여러 개의 기본 또는 정적 메서드가 있을 수 있지만 추상 메서드는 하나만 있을 수 있습니다.
Java 8부터는 람다 표현식과 메소드 참조를 사용하여 기능적 인터페이스의 인스턴스를 나타낼 수 있습니다.
예: 람다 표현식과 함께 기능 인터페이스 사용
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
산출
New thread created
설명:
- 위 프로그램은 Runnable 기능 인터페이스와 함께 람다 표현식을 사용하는 방법을 보여줍니다.
- Runnable에는 하나의 추상 메서드 run()이 있으므로 기능적 인터페이스로 적합합니다.
- Lambda ()-> System.out.println('새 스레드 생성됨')은 run() 메서드를 정의합니다.
- new Thread().start()는 람다 본문을 실행하는 새 스레드를 시작합니다.
메모:
에이 에프 기능적 인터페이스는 또 다른 기능적 인터페이스를 확장할 수도 있습니다.
@FunctionalInterface 주석
@FunctionalInterface 주석은 기능적 인터페이스가 두 개 이상의 추상 메서드를 가질 수 없도록 하는 데 사용됩니다. 둘 이상의 추상 메소드가 있는 경우 컴파일러는 '예기치 않은 @FunctionalInterface 주석' 메시지를 표시합니다. 그러나 이 주석을 반드시 사용해야 하는 것은 아닙니다.
메모:
@FunctionalInterface 주석은 선택 사항이지만 사용하는 것이 좋습니다. 인터페이스에 추상 메서드가 하나만 있는지 확인하면 초기 단계에서 오류를 잡는 데 도움이 됩니다.
예: @FunctionalInterface 주석을 사용하여 기능적 인터페이스 정의
Java@FunctionalInterface interface Square { int calculate(int x); } class Geeks { public static void main(String args[]) { int a = 5; // lambda expression to define the calculate method Square s = (int x) -> x * x; // parameter passed and return type must be same as defined in the prototype int ans = s.calculate(a); System.out.println(ans); } }
산출
25
설명 :
- Square는 단일 메서드 계산(int x)을 사용하는 기능적 인터페이스입니다.
- 람다 식(int x) -> x * x는 계산 메서드를 구현하는 데 사용됩니다.
- Lambda는 x를 입력으로 사용하고 x * x를 반환합니다.
Java 8 이전의 Java 기능 인터페이스
Java 8 이전에는 익명의 내부 클래스 객체를 생성하거나 이러한 인터페이스를 구현해야 했습니다. 다음은 람다 표현식이 도입되기 전에 Runnable 인터페이스가 어떻게 구현되었는지 보여주는 예입니다.
카일리 제너 형제자매
예: 기능적 인터페이스를 보여주는 Java 프로그램
Javaclass Geeks { public static void main(String args[]) { // create anonymous inner class object new Thread(new Runnable() { @Override public void run() { System.out.println('New thread created'); } }).start(); } }
산출
New thread created
내장 Java 기능 인터페이스
Java SE 1.8 이후에는 기능적 인터페이스로 변환되는 인터페이스가 많이 있습니다. 이러한 모든 인터페이스에는 @FunctionalInterface라는 주석이 달려 있습니다. 이러한 인터페이스는 다음과 같습니다.
- 실행 가능: 이 인터페이스에는 달리다() 방법.
- 유사한: 이 인터페이스에는 CompareTo() 메서드만 포함되어 있습니다.
- 액션리스너: 이 인터페이스에는 actionPerformed() 메서드만 포함되어 있습니다.
- 호출 가능: 이 인터페이스에는 call() 메서드만 포함되어 있습니다.
Java의 기능적 인터페이스 유형
Java SE 8에는 아래와 같이 다양한 상황에 적용할 수 있는 네 가지 주요 기능 인터페이스가 포함되어 있습니다.
- 소비자
- 술부
- 기능
- 공급자
1. 소비자
그만큼 소비자 인터페이스 기능적 인터페이스 중 하나는 단 하나의 인수 또는 고급화된 인수만 허용하는 인터페이스입니다. 소비자 인터페이스에는 반환 값이 없습니다. 아무것도 반환하지 않습니다. Consumer의 기능적 변형도 있습니다. DoubleConsumer 내부소비자 그리고 LongConsumer . 이러한 변형은 기본 값을 인수로 허용합니다.
이러한 변형 외에도 다음과 같은 Consumer 인터페이스 변형이 하나 더 있습니다. 이중 소비자 .
통사론:
소비자
소비자 = (값) -> System.out.println(값);
Java 소비자 기능 인터페이스의 이 구현은 print 문에 매개변수로 전달된 값을 인쇄합니다. 이 구현에서는 Java의 Lambda 기능을 사용합니다.
2. 술어
그만큼 술어 인터페이스 하나의 인수에 대한 부울 값 함수를 나타냅니다. 일반적으로 스트림의 작업을 필터링하는 데 사용됩니다. 소비자 기능 인터페이스와 마찬가지로 Predicate 기능 인터페이스에도 몇 가지 확장이 있습니다. 이들은 IntPredicate DoublePredicate 그리고 LongPredicate . 이러한 유형의 술어 기능 인터페이스는 기본 데이터 유형 또는 값만 인수로 허용합니다.
통사론:
공개 인터페이스 술어
{
불리언 테스트(T t);
}
Java 조건자 기능 인터페이스는 Lambda 표현식을 사용하여 구현할 수도 있습니다.
rhel 대 센토스
술부
조건자 = (값) -> 값 != null;
3. 기능
에이 기능 단일 인수만 받고 필요한 처리 후에 값을 반환하는 Java의 기능적 인터페이스 유형입니다. 다양한 버전의 함수 인터페이스는 도구이며 일반적으로 double int long과 같은 기본 유형에 사용됩니다.
통사론:
기능
함수 = (값) -> 값 * 값;
- 이중 기능: 그만큼 이중 기능 기능과 실질적으로 관련되어 있습니다. 게다가 두 개의 인수를 사용하는 반면 Function은 하나의 인수를 허용합니다.
- 단항 연산자 및 이항 연산자: 다음과 같은 두 가지 다른 기능 인터페이스도 있습니다. 단항 연산자 그리고 바이너리 연산자. 둘 다 입력 유형과 출력 유형이 모두 동일한 Function 및 Bi-Function을 각각 확장합니다.
4. 공급자
그만큼 공급자 기능적 인터페이스는 입력이나 인수를 취하지 않지만 단일 출력을 반환하는 기능적 인터페이스 유형이기도 합니다. 공급자 기능 인터페이스의 다양한 확장에는 다음과 같은 많은 다른 공급자 기능이 포함됩니다. 부울 공급업체 이중 공급업체 롱공급자 그리고 내부공급자 . 이러한 모든 추가 특수화의 반환 유형은 해당 기본 형식뿐입니다.
통사론:
공급자
공급자 = () -> 'Hello World!';
예: 조건자 인터페이스를 사용하여 문자열 필터링
Javaimport java.util.*; import java.util.function.Predicate; class Geeks { public static void main(String args[]) { // create a list of strings List<String> n = Arrays.asList('Geek' 'GeeksQuiz' 'g1' 'QA' 'Geek2'); // declare the predicate type as string and use lambda expression to create object Predicate<String> p = (s) -> s.startsWith('G'); // Iterate through the list for (String st : n) { // call the test method if (p.test(st)) System.out.println(st); } } }
산출
Geek GeeksQuiz Geek2
기능적 인터페이스 표
기능적 인터페이스 | 설명 | 방법 |
|---|---|---|
실행 가능 | 스레드에 의해 실행될 수 있는 작업을 나타냅니다. | 무효 실행() |
유사한 | 주문을 위해 두 개체를 비교합니다. | int 비교To(T o) |
액션리스너 | 이벤트 중심 프로그래밍에서 작업 이벤트를 처리합니다. | 무효 actionPerformed(ActionEvent e) |
호출 가능 | 결과를 반환하거나 예외를 발생시킬 수 있는 작업을 나타냅니다. | V call()이 예외를 발생시킵니다. |
소비자 | 단일 입력 인수를 허용하고 결과를 반환하지 않습니다. | 무효 수락(T t) |
술부 | 단일 인수를 허용하고 부울 결과를 반환합니다. 마지막 커밋 git 제거 | 부울 테스트(T t) |
기능 | 단일 인수를 허용하고 결과를 반환합니다. 자바용 mvc | R 적용(T t) |
공급자 | 인수는 사용하지 않지만 결과를 제공합니다. | T get() |
이중소비자 | 두 개의 인수를 허용하고 결과를 반환하지 않습니다. | 무효 수락(T t U u) |
이중 예측 | 두 개의 인수를 허용하고 부울 결과를 반환합니다. | 부울 테스트(T t U u) |
이중 기능 | 두 개의 인수를 받아들이고 결과를 반환합니다. | R 신청(T t U u) |
단항 연산자 | 이는 입력 유형과 출력 유형이 동일한 함수의 특별한 경우입니다. | T 적용(T T) |
바이너리연산자 | 이는 입력 및 출력 유형이 동일한 BiFunction의 특별한 경우입니다. | T 적용(T t1 T t2) |
관련 기사
- 자바 8
- Java 람다 표현식