programing

Java 8의 기능 인터페이스는 어떤 용도로 사용됩니까?

sourcetip 2022. 7. 15. 23:33
반응형

Java 8의 기능 인터페이스는 어떤 용도로 사용됩니까?

Java 8에서 "기능 인터페이스"라는 새로운 용어를 발견했습니다.람다 표현으로 작업하는 동안 단 한 가지 사용법을 찾을 수 있었습니다.

하고 있어 경우 8을 할 수 .@FunctionalInterface 할 수 .인터페이스로 선언할 수 있는 것은 1개의 메서드뿐입니다.

예를 들어 다음과 같습니다.

@FunctionalInterface
interface MathOperation {
    int operation(int a, int b);
}

Java 8에서는 람다 표현식만 사용하는 것 외에 얼마나 유용합니까?

(여기 있는 질문은 제가 질문한 것과 다릅니다.람다 표현식 작업 중에 기능 인터페이스가 필요한 이유를 묻고 있습니다.질문입니다.기능 인터페이스의 다른 용도는 람다 식과 함께 사용하는 것 외에 어떤 것이 있습니까?

@FunctionalInterface주석은 코드 컴파일 시간 확인에 유용합니다. 하다 말고는 을 사용할 수 .static,default를 덮어씁니다.Object 안에서@FunctionalInterface또는 기능 인터페이스로서 사용되는 다른 인터페이스.

이 를 사용할 수 , 이 주석 없이도 할 수 있고, 이 주석 없이도 할 수 .@Override석입니니다다

문서로부터

기능 인터페이스는 정확히 하나의 추상적인 방법을 가지고 있습니다.기본 메서드는 구현되어 있으므로 추상적이지 않습니다.인터페이스가 java.lang의 공용 메서드 중 하나를 덮어쓰고 추상 메서드를 선언한 경우.오브젝트. 인터페이스의 구현은 java.lang에서 구현되기 때문에 인터페이스의 추상 메서드 수에 포함되지 않습니다.오브젝트 또는 기타

이것은 람다 식에 사용할 수 있습니다.

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();
}

잘못된 '@Functional'인터페이스' 주석. Foo는 기능 인터페이스가 아닙니다.

문서는 목적과 목적의 차이를 만듭니다.

인터페이스 타입 선언이 Java Language Specification에서 정의된 기능 인터페이스임을 나타내기 위해 사용되는 정보 주석 유형입니다.

및 사용 사례

기능 인터페이스의 인스턴스는 람다 표현식, 메서드 참조 또는 컨스트럭터 참조를 사용하여 생성할 수 있습니다.

다른 일반적인 사용 사례를 배제하지 않는 문구.주요 목적은 기능 인터페이스를 나타내는 것이므로 실제 질문은 "람다 표현식 및 메서드/컨스트럭터 참조 외에 기능 인터페이스에 대한 다른 사용 사례가 있습니까?"로 요약됩니다.

기능 인터페이스는 Java Language Specification에 의해 정의된 Java 언어 구성체이므로 이 사양만이 이 질문에 답할 수 있습니다.

JLS © 9.8. 기능 인터페이스:

클래스('15.9)를 선언 및 인스턴스화함으로써 인터페이스인스턴스를 작성하는 통상의 프로세스와 더불어 기능 인터페이스의 인스턴스는 메서드 참조식 및 람다식('15.13, '15.27)을 사용하여 작성할 수 있습니다.

따라서 Java Language Specification에는 달리 명시되어 있지 않습니다.이 섹션에서 언급된 유일한 사용 사례는 메서드 참조 표현식과 람다 표현식을 사용하여 인터페이스 인스턴스를 작성하는 것입니다(이것은 설계자 참조를 포함합니다).

한마디로 Java 8에는 다른 사용 사례가 없습니다.

다른 사람들이 말했듯이, 기능 인터페이스는 하나의 방법을 노출하는 인터페이스입니다.여러 개의 메서드를 사용할 수 있지만 다른 모든 메서드는 기본 구현이어야 합니다.「기능 인터페이스」라고 불리는 이유는, 기능으로서 효과적으로 기능하기 때문입니다.인터페이스를 매개 변수로 전달할 수 있기 때문에 함수 프로그래밍 언어처럼 함수가 "일류 시민"임을 의미합니다.이것은 많은 이점을 가지고 있으며, Stream API를 사용하면 많은 이점을 볼 수 있을 것입니다.물론 람다 표현은 그들에게 가장 명백한 사용법이다.

천만에요.이 주석의 유일한 점은 람다 표현식입니다.

람다 식은 기능 인터페이스 유형에 할당할 수 있지만 메서드 참조 및 익명 클래스에도 할당할 수 있습니다.

에 되어 있는 특정 기능 중 .java.util.function새로운 기능을 만들기 위해 구성될 수 있다는 것입니다(예:Function.andThen ★★★★★★★★★★★★★★★★★」Function.compose,Predicate.and한 메서드가 되어 있기 에, 「 」는 「 」를 참조해 주세요.

추상적인 메서드가1개뿐인 인터페이스를 기능 인터페이스라고 부릅니다.반드시 @Functional을 사용할 필요는 없습니다.인터페이스. 그러나 실수로 추가 메서드가 추가되는 것을 방지하기 위해 기능 인터페이스와 함께 사용하는 것이 가장 좋습니다.인터페이스에 @Functional로 주석이 붙어 있는 경우인터페이스 주석으로 여러 추상 메서드를 사용하려고 하면 컴파일러 오류가 발생합니다.

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

  • 주석에서는 인터페이스에 추상 메서드가 하나만 포함되어 있는지 확인합니다.그렇지 않으면 오류를 발생시킵니다.
  • @functional 이라도인터페이스가 없어도 기능하는 인터페이스입니다(단일 추상 메서드가 있는 경우).주석은 실수를 방지하는 데 도움이 됩니다.
  • 기능 인터페이스에는 스태틱 메서드와 디폴트 메서드가 추가되어 있을 수 있습니다.
  • 예: Itable <> Comparible <> Comparator <>

기능 인터페이스의 응용 프로그램:

  • 메서드 레퍼런스
  • 람다 식
  • 컨스트럭터 참조

기능 인터페이스를 학습하려면 인터페이스에서 첫 번째 기본 메서드를 학습하고 기능 인터페이스를 학습한 후 메서드 참조 및 람다 식을 쉽게 이해할 수 있습니다.

Java 8에서 람다를 사용할 수 있습니다.

public static void main(String[] args) {
    tentimes(inputPrm - > System.out.println(inputPrm));
    //tentimes(System.out::println);  // You can also replace lambda with static method reference
}

public static void tentimes(Consumer myFunction) {
    for (int i = 0; i < 10; i++)
        myFunction.accept("hello");
}

Java Lambdas 및 기능에 대한 자세한 내용은인터페이스

@FunctionalInterfaceJava 8과 함께 릴리스된 새로운 주석으로, lambda 식에 대한 대상 유형을 제공하며 코드 컴파일 시간 확인에 사용됩니다.

사용하고 싶은 경우:

1-인터페이스에 추상 메서드가 여러 개 있으면 컴파일 오류가 발생합니다.그렇지 않으면 컴파일 오류가 발생합니다.

1- 인터페이스는 순수해야 합니다.즉, 기능 인터페이스는 스테이트리스 클래스에 의해서 실장되도록 되어 있습니다.단순한 것은Comparatorinterface는 구현자 상태에 의존하지 않기 때문에 이 경우 컴파일 오류는 발생하지 않지만 대부분의 경우 이러한 종류의 인터페이스에서는 lamda를 사용할 수 없습니다.

java.util.function패키지에는 다음과 같은 다양한 범용 기능 인터페이스가 포함되어 있습니다.Predicate,Consumer,Function,그리고.Supplier.

또한 이 주석 없이 람다를 사용할 수 있습니다.

다른 답변과 더불어 "람다 표현식 직접 사용 이외의 기능 인터페이스를 사용하는 이유"의 주된 이유는 객체 지향 자바 언어의 특성과 관련이 있을 수 있다고 생각합니다.

람다 식의 주요 속성은 1입니다.이들은 대략 2. 향후 특정 시간(수회)에 실행될 수 있습니다.언어에서 이 기능을 지원하기 위해 일부 다른 언어에서는 이 문제를 간단히 다루고 있습니다.

예를 들어 Java 스크립트에서는 함수(Anonymous Function 또는 Function Literals)를 개체로 지정할 수 있습니다.따라서 간단하게 작성할 수 있으며 변수에 할당할 수도 있습니다.예를 들어 다음과 같습니다.

var myFunction = function (...) {
    ...;
}
alert(myFunction(...));

또는 ES6를 통해 화살표 기능을 사용할 수 있습니다.

const myFunction = ... => ...

지금까지 Java 언어 설계자는 이러한 방법(기능 프로그래밍 기술)을 통해 언급된 기능을 처리하는 것을 받아들이지 않았습니다.이들은 Java 언어가 객체 지향이므로 객체 지향 기술을 통해 이 문제를 해결해야 한다고 생각합니다.Java 언어의 단순성과 일관성을 놓치고 싶지 않습니다.

따라서 하나의 메서드(즉 기능 인터페이스)를 가진 인터페이스의 객체가 필요한 경우 람다 식으로 대체할 수 있도록 인터페이스를 사용합니다.예를 들어 다음과 같습니다.

ActionListener listener = event -> ...;

: 방식 또는 스태틱 방식의 단일 경우 라고 불립니다.인터페이스는 디폴트 메서드 또는 스태틱메서드의 수에 관계없이 단일 추상 메서드를 가진 경우 기능 인터페이스라고 불립니다.람다 Runnable,Callable,Comparable,Comparator는 몇 입니다.Functional인터페이스

키노트:

  • ★★@FunctionalInterface가 사용됩니다(임의).
  • 디폴트 메서드와 스태틱 메서드의 수에 관계없이 추상 메서드는 1개만 사용해야 합니다.
  • 의 추상적인 에러)를 발생시킨다.@FunctionalInterface주석을 사용합니다).

이 스레드에서는 기능 인터페이스가 익명 클래스에 대해 제공하는 이점과 그 사용 방법에 대해 자세히 설명합니다.

언급URL : https://stackoverflow.com/questions/36881826/what-are-functional-interfaces-used-for-in-java-8

반응형