Java 8에서 “기능적 인터페이스”라는 새로운 용어를 발견했습니다. 람다 식으로 작업하는 동안 하나만 사용할 수있었습니다 .
Java 8은 일부 내장 기능 인터페이스를 제공하며 기능 인터페이스를 정의하려는 경우 @FunctionalInterface
주석 을 사용할 수 있습니다 . 인터페이스에서 단일 메소드 만 선언 할 수 있습니다.
예를 들면 다음과 같습니다.
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
}
람다 식으로 작업하는 것 외에 Java 8에서는 얼마나 유용 합니까?
(질문 여기가 내가 물었다 것과 다른 그것은 람다 식으로 작업하는 동안 우리는 기능적인 인터페이스가 필요한 이유를 묻는 내 질문은 :.. 다른 용도로는 기능 인터페이스는 람다 표현식 외에해야 할 이유는 무엇입니까?)
답변
@FunctionalInterface
주석은 코드의 컴파일 시간 확인에 유용합니다. 둘 이상의 외에 방법이 없다 static
, default
그리고 추상적 인 방법을한다는 점에서 재정의 방법 Object
에 @FunctionalInterface
또는 기능적 인터페이스로 사용되는 다른 인터페이스.
그러나이 주석없이 람다를 사용할 수 있으며 주석없이 메소드를 재정의 할 수 있습니다 @Override
.
문서에서
기능적 인터페이스에는 정확히 하나의 추상 메소드가 있습니다. 기본 메소드에는 구현이 있으므로 추상적이지 않습니다. 인터페이스가 java.lang.Object의 공개 메소드 중 하나를 대체하는 추상 메소드를 선언하는 경우 인터페이스의 모든 구현은 java.lang.Object 또는 다른 곳에서 구현을 가지므로 인터페이스의 추상 메소드 수에도 포함되지 않습니다.
이것은 사용할 수 있습니다 람다 식에 :
public interface Foo {
public void doSomething();
}
이 작업은 사용할 수 없습니다 람다 식에 :
public interface Foo {
public void doSomething();
public void doSomethingElse();
}
그러나 이것은 컴파일 오류 를 줄 것입니다 :
@FunctionalInterface
public interface Foo {
public void doSomething();
public void doSomethingElse();
}
잘못된 ‘@FunctionalInterface’주석; Foo는 기능적인 인터페이스가 아닙니다
답변
문서는 참 목적 사이의 차이를 만든다
인터페이스 유형 선언이 Java 언어 사양에 정의 된 기능적 인터페이스 임을 나타 내기 위해 사용되는 정보 주석 유형 입니다.
그리고 유스 케이스
기능적 인터페이스의 인스턴스는 람다 식, 메서드 참조 또는 생성자 참조를 사용하여 만들 수 있습니다.
일반적으로 다른 사용 사례를 배제하지 않는 표현. 주요 목적은 기능적 인터페이스 를 나타내는 것이기 때문에 실제 질문 은 ” 람다 식 및 메소드 / 생성자 참조 이외의 기능적 인터페이스에 대한 다른 사용 사례가 있습니까?”로 요약됩니다.
때문에 기능적인 인터페이스는 Java 언어 사양에 의해 정의 된 자바 언어 구조이며, 규격은 그 질문에 대답 할 수있는 것만 :
…
클래스를 선언하고 인스턴스화 (§15.9)하여 인터페이스 인스턴스를 작성하는 일반적인 프로세스 외에도 메소드 참조 표현식 및 람다 표현식 (§15.13, §15.27)으로 기능 인터페이스 인스턴스를 작성할 수 있습니다.
따라서 Java 언어 사양에서는 달리 언급하지 않습니다. 해당 섹션에 언급 된 유일한 사용 사례는 메소드 참조 표현식 및 람다 표현식으로 인터페이스 인스턴스를 작성하는 것입니다. (이것은 스펙에서 메소드 참조 표현식의 한 형식으로 언급되는 생성자 참조를 포함합니다).
따라서 한 문장에서 Java 8에는 다른 유스 케이스가 없습니다.
답변
다른 사람들이 말했듯이 기능적 인터페이스는 한 가지 방법을 노출시키는 인터페이스입니다. 메소드가 둘 이상있을 수 있지만 다른 모든 메소드에는 기본 구현이 있어야합니다. 그것이 “기능적 인터페이스”라고 불리는 이유는 그것이 효과적으로 기능으로 작용하기 때문입니다. 인터페이스를 매개 변수로 전달할 수 있기 때문에 함수형 함수형 언어와 같이 함수가 이제 “일류 시민”임을 의미합니다. 여기에는 많은 이점이 있으며 Stream API를 사용할 때 많은 이점이 있습니다. 물론 람다식이 주된 용도입니다.
답변
전혀. Lambda 표현식은 해당 주석의 유일한 포인트입니다.
답변
람다 식은 기능적 인터페이스 유형에 할당 할 수 있지만 메소드 참조 및 익명 클래스도 지정할 수 있습니다.
의 특정 기능 인터페이스에 대한 하나의 좋은 점은 java.util.function
그들이 (같은 새로운 기능을 만들기 위해 구성 될 수 있다는 것입니다 Function.andThen
및 Function.compose
, Predicate.and
등)에 의한에 포함 된 편리한 기본 방법에 관한 것이다.
답변
추상 메소드가 하나만있는 인터페이스를 기능 인터페이스라고합니다. @FunctionalInterface를 반드시 사용해야하는 것은 아니지만 실수로 추가 메서드를 추가하지 않도록 기능 인터페이스와 함께 사용하는 것이 가장 좋습니다. @FunctionalInterface 주석으로 인터페이스에 주석을 달고 둘 이상의 추상 메소드를 사용하려고 시도하면 컴파일러 오류가 발생합니다.
package com.akhi;
@FunctionalInterface
public interface FucnctionalDemo {
void letsDoSomething();
//void letsGo(); //invalid because another abstract method does not allow
public String toString(); // valid because toString from Object
public boolean equals(Object o); //valid
public static int sum(int a,int b) // valid because method static
{
return a+b;
}
public default int sub(int a,int b) //valid because method default
{
return a-b;
}
}
답변
기능성 인터페이스 :
- Java 8에 도입
- “단일 추상”메소드를 포함하는 인터페이스.
예 1 :
interface CalcArea { // --functional interface
double calcArea(double rad);
}
예 2 :
interface CalcGeometry { // --functional interface
double calcArea(double rad);
default double calcPeri(double rad) {
return 0.0;
}
}
예 3 :
interface CalcGeometry { // -- not functional interface
double calcArea(double rad);
double calcPeri(double rad);
}
Java8 주석- @FunctionalInterface
- 주석은 인터페이스에 추상 메소드가 하나만 포함되어 있는지 확인하십시오. 그렇지 않으면 오류를 발생시킵니다.
- @FunctionalInterface가 없어도 여전히 기능적인 인터페이스입니다 (단일 추상 메소드가있는 경우). 주석은 실수를 피하는 데 도움이됩니다.
- 기능 인터페이스에는 추가 정적 및 기본 메소드가있을 수 있습니다.
- 예를 들어 Iterable <>, Comparable <>, Comparator <>.
기능적 인터페이스의 응용 :
- 메소드 참조
- 람다 식
- 생성자 참조
기능적 인터페이스를 배우고, 인터페이스의 첫 번째 기본 메소드를 배우고, 기능적 인터페이스를 학습 한 후에는 메소드 참조 및 람다 표현을 이해하기가 쉬울 것입니다