web-dev-qa-db-ja.com

Java 8)で「特定のタイプの任意のオブジェクト」とはどういう意味ですか?

Java 8には、「メソッド参照」機能があります。その種類の1つは、「特定のタイプの任意のオブジェクトのインスタンスメソッドへの参照」です。

http://docs.Oracle.com/javase/tutorial/Java/javaOO/methodreferences.html#type

その文脈で「特定のタイプの任意のオブジェクト」が何を意味するのか誰かが説明できますか?

18
Roman Ivanov

これは、あるタイプからのインスタンスメソッドへの参照です。この例の場合、compareToIgnoreCaseStringからのメソッドです。プログラムは、Stringのインスタンスでこのメソッドを呼び出すことができることを知っているので、そのタイプの参照と任意のオブジェクトを取得して、メソッドが存在することを保証できます。

これをMethodクラスと比較すると、メソッドを参照し、あるタイプの任意のインスタンスで呼び出すことができます。

この例では、2つのStringオブジェクトを使用し、一方でcompareToIgnoreCaseを呼び出し、もう一方を引数として使用してメソッドのシグネチャを照合できます。これにより、コンパレータインスタンスでこれを行う代わりに、配列を取得して、配列タイプの任意のメソッドに基づいて並べ替えることができます。

そして、これは質問のリンクをクリックしなかった人のための例です:

String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda", "George" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
14
Andrew Vitkus

リンクされた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)を持つコンパレータが作成されます。次に、abが何であるかをよく尋ねます。 compareメソッドの最初の引数はaになり、2番目の引数はbになります。これらは、String型(特定の型)の任意のオブジェクトです。

分かりませんか?

  • コンパレータとは何かとその実装方法を知っていることを確認してください。
  • 関数型インターフェースとは何か、そしてそれがJavaのラムダにどのように影響するかを知ってください。
  • コンパレータは機能インターフェイスですこれが、メソッド参照がコンパレータオブジェクト内のcompareメソッドの本体になる理由です。
  • ページの下部にある別の例については以下のソースをお読みください。

ソースで詳細を読む: http://moandjiezana.com/blog/2014/understanding-method-references/

21
Jawad

https://docs.Oracle.com/javase/tutorial/Javaで説明されている「特定のタイプの任意のオブジェクトのインスタンスメソッドへの参照」カテゴリを説明する以下のコードサンプルを参照してください。 /javaOO/methodreferences.html

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を比較して、違いを確認してください。

3
Viraj

別の言い方をすれば。したがって、ラムダ式が次のようになっている場合:

(<ContainingType arg>, <otherArgs>) -> arg.instanceMethod(<otherArgs>)

次のようなメソッド参照に置き換えることができます

ContainingType::instanceMethod

したがって、ラムダ式の場合

(String a, String b) -> a.compareToIgnoreCase(b)

次のようなメソッド参照に置き換えることができます

String::compareToIgnoreCase

ここで、特定のタイプはStringであるContainingTypeです。そしてそのインスタンス(文字列)は任意ですまだ宣言または初期化されていないため、これらはここでの引数にすぎません。したがって、このコンテキストでの「特定のタイプの任意のオブジェクト」は「文字列タイプの任意のオブジェクト "

0
Laks