Java 8には、「メソッド参照」機能があります。その種類の1つは、「特定のタイプの任意のオブジェクトのインスタンスメソッドへの参照」です。
http://docs.Oracle.com/javase/tutorial/Java/javaOO/methodreferences.html#type
その文脈で「特定のタイプの任意のオブジェクト」が何を意味するのか誰かが説明できますか?
これは、あるタイプからのインスタンスメソッドへの参照です。この例の場合、compareToIgnoreCase
はString
からのメソッドです。プログラムは、String
のインスタンスでこのメソッドを呼び出すことができることを知っているので、そのタイプの参照と任意のオブジェクトを取得して、メソッドが存在することを保証できます。
これをMethod
クラスと比較すると、メソッドを参照し、あるタイプの任意のインスタンスで呼び出すことができます。
この例では、2つのString
オブジェクトを使用し、一方でcompareToIgnoreCase
を呼び出し、もう一方を引数として使用してメソッドのシグネチャを照合できます。これにより、コンパレータインスタンスでこれを行う代わりに、配列を取得して、配列タイプの任意のメソッドに基づいて並べ替えることができます。
そして、これは質問のリンクをクリックしなかった人のための例です:
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda", "George" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
リンクされたOracleDocの例は次のとおりです。
_String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
_
に相当するラムダ
_ String::compareToIgnoreCase
_
だろう
_(String a, String b) -> a.compareToIgnoreCase(b)
_
Arrays.sort()
メソッドは、2番目の引数としてコンパレーターを探しています(この例では)。 _String::compareToIgnoreCase
_を渡すと、比較メソッドの本体としてa.compareToIgnoreCase(b)
を持つコンパレータが作成されます。次に、a
とb
が何であるかをよく尋ねます。 compareメソッドの最初の引数はa
になり、2番目の引数はb
になります。これらは、String型(特定の型)の任意のオブジェクトです。
分かりませんか?
ソースで詳細を読む: http://moandjiezana.com/blog/2014/understanding-method-references/
import Java.util.Arrays;
class Person{
String name;
//constructor
public Person(String name){
this.name = name;
}
//instance method 1
public int personInstanceMethod1(Person person){
return this.name.compareTo(person.name);
}
//instance method 2
public int personInstanceMethod2(Person person1, Person person2){
return person1.name.compareTo(person2.name);
}
}
class Test {
public static void main (String[] args) throws Exception{
Person[] personArray = {new Person("A"), new Person("B")};
// Scenario 1 : Getting compiled successfully
Arrays.sort(personArray, Person::personInstanceMethod1);
// Scenario 2 : Compile failure
Arrays.sort(personArray, Person::personInstanceMethod2);
// Scenario 3 : Getting compiled successfully.
Person personInstance = new Person("C");
Arrays.sort(personArray, personInstance::personInstanceMethod2);
// Scenario 4 : Getting compiled successfully. As the same way as "Scenario 1"
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
}
}
シナリオ1およびシナリオ4では、 https://docs.Oracle.com/javase/tutorial/Java/javaOOで説明されている「特定のタイプの任意のオブジェクトのインスタンスメソッドへの参照」カテゴリについて説明しています。 /methodreferences.html
メソッドパラメータが要素のインスタンスタイプと同じインスタンスタイプの変数を受け取る場合、Typeを使用してそのインスタンスメソッドを呼び出すことができます。(Person :: personInstanceMethod1)
「Person」クラスの「personInstanceMethod1」インスタンスメソッドを「String」クラスの「compareToIgnoreCase」インスタンスメソッドと比較します( https://docs.Oracle.com/javase/8/docs/api/ Java/lang/String.html#compareToIgnoreCase-Java.lang.String- )で、類似性を確認します。どちらも同じタイプの単一のパラメーターを使用しています。
シナリオ1とシナリオ2を比較して、違いを確認してください。
別の言い方をすれば。したがって、ラムダ式が次のようになっている場合:
(<ContainingType arg>, <otherArgs>) -> arg.instanceMethod(<otherArgs>)
次のようなメソッド参照に置き換えることができます
ContainingType::instanceMethod
したがって、ラムダ式の場合
(String a, String b) -> a.compareToIgnoreCase(b)
次のようなメソッド参照に置き換えることができます
String::compareToIgnoreCase
ここで、特定のタイプはStringであるContainingTypeです。そしてそのインスタンス(文字列)は任意ですまだ宣言または初期化されていないため、これらはここでの引数にすぎません。したがって、このコンテキストでの「特定のタイプの任意のオブジェクト」は「文字列タイプの任意のオブジェクト "