173

Java 8 で「機能的インターフェース」という新しい用語に出くわしました。ラムダ式で作業しているときに、その使用法を 1 つしか見つけることができませんでした。

Java 8 はいくつかの組み込み機能インターフェースを提供します。機能インターフェースを定義したい場合は、@FunctionalInterfaceアノテーションを利用できます。インターフェイスで単一のメソッドのみを宣言できるようになります。

例えば:

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

ラムダ式を操作する以外に、Java 8 でどのくらい便利ですか?

(ここでの質問は、私が尋ねたものとは異なります。ラムダ式を扱うときに関数型インターフェースが必要な理由を尋ねています。私の質問は、ラムダ式での使用以外に、関数型インターフェースの他の用途は何ですか?)

4

11 に答える 11

23
于 2016-04-27T08:34:19.113 に答える
7

ラムダ式は関数型インターフェイスの型に割り当てることができますが、メソッド参照や匿名クラスにも割り当てることができます。

の特定の関数型インターフェースの良い点の 1 つは、それらに含まれる便利なデフォルト メソッドにより、java.util.function新しい関数 (Function.andThenFunction.compose、など) を作成するように構成できることです。Predicate.and

于 2016-04-27T06:46:44.777 に答える
6

抽象メソッドが 1 つだけのインターフェイスは、関数型インターフェイスと呼ばれます。@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;
        }
    }
于 2018-09-26T05:52:35.563 に答える
4

機能インターフェース:

  • 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

  • インターフェイスに抽象メソッドが 1 つしか含まれていないことを注釈チェックします。そうでない場合は、エラーを発生させます。
  • @FunctionalInterface がなくても、機能的なインターフェイスです (単一の抽象メソッドがある場合)。注釈は間違いを避けるのに役立ちます。
  • 機能インターフェイスには、追加の静的メソッドとデフォルト メソッドがある場合があります。
  • 例: Iterable<>、Comparable<>、Comparator<>。

機能的インターフェースの応用:

  • メソッド参照
  • ラムダ式
  • コンストラクタ参照

関数型インターフェースを学ぶには、最初にインターフェースのデフォルトメソッドを学び、関数型インターフェースを学んだ後、メソッド参照とラムダ式を理解するのは簡単です

于 2018-12-18T12:53:14.727 に答える
1

他の回答に加えて、「ラムダ式を直接使用する以外に関数型インターフェイスを使用する理由」の主な理由は、オブジェクト指向であるJava言語の性質に関連していると思います。

ラムダ式の主な属性は次のとおりです。 1. 前後に渡すことができます。 2. 後で特定の時間 (数回) に実行できます。言語でこの機能をサポートするために、他のいくつかの言語はこの問題を簡単に処理します。

たとえば、Java Script では、関数 (無名関数、または関数リテラル) をオブジェクトとしてアドレス指定できます。したがって、簡単に作成でき、変数などに割り当てることもできます。例えば:

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

またはES6を介して、矢印機能を使用できます。

const myFunction = ... => ...

これまで、Java 言語の設計者は、前述の機能をこれらの方法 (関数型プログラミング手法) で処理することを受け入れていません。彼らは、Java 言語がオブジェクト指向であると信じているため、オブジェクト指向の手法を使用してこの問題を解決する必要があります。彼らは、Java 言語の単純さと一貫性を見逃したくありません。

したがって、それらはインターフェイスを使用します。メソッドが 1 つしかないインターフェイスのオブジェクト (関数インターフェイスを意味します) が必要な場合は、それをラムダ式に置き換えることができます。そのような:

ActionListener listener = event -> ...;
于 2018-09-14T13:44:00.140 に答える
0

機能インターフェース: デフォルトまたは静的メソッドの数に関係なく、単一の抽象メソッドを持つインターフェースは機能インターフェースと呼ばれます。Functional Interface は、ラムダ式に使用されます。RunnableCallableComparable、はインターフェイスComparatorの例です。Functional

キーノート:

  • 注釈@FunctionalInterfaceが使用されます (オプション)。
  • 抽象メソッドは 1 つだけにする必要があります (デフォルトおよび静的メソッドの数に関係なく)。
  • 2 つの抽象メソッドでコンパイル エラーが発生します (Provider@FunctionalInterfaceアノテーションが使用されています)。

このスレッドでは、関数型インターフェイスが匿名クラスよりも優れている点と、その使用方法について詳しく説明しています。

于 2020-11-25T07:27:05.663 に答える