私は、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
私たちが実施している方法は?
説明
Comparator
ある機能インタフェースは(唯一の方法が必要)。したがって、あなたは、ラムダ式を使用することによって、それのインスタンスを作成することができます。
そのような延びている正規クラスまたは匿名クラスとしてインスタンスを作成する他の方法に非常に似て挙動します。
ラムダは、機能インタフェースは要求一つの方法を指します。唯一の方法があるので、それは曖昧ではありません。ラムダ名入力引数と、メソッドの実装を与える(それが提供する体)。
概要
あなたは、作成するには、以下のオプションがありインスタンスインターフェースや抽象クラスのを:
- 拡張するクラスを作成し、新しい使用
- 匿名クラスを使用します
我々は唯一提供していますインターフェイスしているはずの一つの方法は、(それが呼ばれていた機能のインターフェース、その後)、我々は、さらにそれのインスタンスを作成するには、次の2つのオプションがあります。
- ラムダ式を使用します
- メソッド参照を使用します
一例として、我々は次のインターフェイスを使用して、乗算インスタンスを作成します:
@FunctionalInterface
public interface Operation {
int op(int a, int b);
}
拡張するクラスを作成し、新しいを使用します。
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
匿名クラスを使用します。
Operation operation = new Operation() { @Override public int op(int a, int b) { return a * b; } }; // Usage System.out.println(operation.op(5, 2)); // 10
ラムダ式を使用します。
Operation operation = (a, b) -> a * b; System.out.println(operation.op(5, 2)); // 10
メソッド参照を使用します。
// 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