どのようにラムダ関数は、コンパレータの比較()メソッドになるん

Sahand:

私は、Java 8で、1がこのようなコンパレータを定義できることを見てきました:

Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge());

これに相当します。

Comparator d = new Comparator<Computer> () {
    @Override
    public int compare(Computer c1, Computer c2){
        return c1.getAge().compareTo(c2.getAge());
    }
};

私はこれがどのように機能するかを理解したいと思います。第2の例では、それはかなり簡単である:Comparatorオブジェクトは、メソッドを使用して作成されcompare使用して比較行うcompareTo方法のage性質をComputer私たちが行う場合は、この方法は、単純に私達によって呼び出されます。

Computer comp1 = new Computer(10);
Computer comp2 = new Computer(11);
d.compare(comp1, comp2); // -1

最初の例では何が起こっている。しかし、ラムダを使用しているとき?我々が設定されているように私には見えるComparator方法その行い比較に等しくなるように。ので、しかし、これは、することはできませんComparatorオブジェクトは、メソッドを持つオブジェクトですcompare私は、ラムダは、(1つの方法だけでインターフェース)機能インタフェースで使用することができることを学びました。しかし、Comparator機能的なインターフェース(それ以外の多くの他の方法を持っているではありませんcompare!)。だから、どのようにそれがあることをJavaインタプリタの知っているcompare私たちが実施している方法は?

Zabuza:

説明

Comparatorある機能インタフェースは(唯一の方法が必要)。したがって、あなたは、ラムダ式を使用することによって、それのインスタンスを作成することができます。

そのような延びている正規クラスまたは匿名クラスとしてインスタンスを作成する他の方法に非常に似て挙動します。

ラムダは、機能インタフェースは要求一つの方法を指します。唯一の方法があるので、それは曖昧ではありません。ラムダ入力引数と、メソッドの実装を与える(それが提供する)。


概要

あなたは、作成するには、以下のオプションがありインスタンスインターフェースや抽象クラスのを:

  1. 拡張するクラスを作成し、新しい使用
  2. 匿名クラスを使用します

我々は唯一提供していますインターフェイスしているはずの一つの方法は、(それが呼ばれていた機能のインターフェース、その後)、我々は、さらにそれのインスタンスを作成するには、次の2つのオプションがあります。

  1. ラムダ式を使用します
  2. メソッド参照を使用します

一例として、我々は次のインターフェイスを使用して、乗算インスタンスを作成します:

@FunctionalInterface
public interface Operation {
    int op(int a, int b);
}
  1. 拡張するクラスを作成し、新しいを使用します。

    public class Multiplicator implements Operation {
        @Override
        public int op(int a, int b) {
            return a * b;
        }
    }
    
    // Usage
    Operation operation = new Multiplicator();
    System.out.println(operation.op(5, 2)); // 10
    
  2. 匿名クラスを使用します。

    Operation operation = new Operation() {
        @Override
        public int op(int a, int b) {
            return a * b;
        }
    };
    
    // Usage
    System.out.println(operation.op(5, 2)); // 10
    
  3. ラムダ式を使用します。

    Operation operation = (a, b) -> a * b;
    System.out.println(operation.op(5, 2)); // 10
    
  4. メソッド参照を使用します。

    // Somewhere else in our project, in the `MathUtil` class
    public static int multiply(int a, int b) {
        return a * b;
    }
    
    // Usage
    Operation operation = MathUtil::multiply;
    System.out.println(operation.op(5, 2)); // 10
    

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=183908&siteId=1