次の記事では、Java メソッド リファレンスの概要を説明します。 JDK 8 では、1 つの操作を実行するための匿名メソッドを 1 行で作成するラムダ式が導入されました。ただし、既存のメソッドが呼び出されるときにラムダ式を記述する場合、そのような操作はメソッド参照を使用して可能になります。これにより、既存のメソッドへの呼び出しが存在する場合、式がよりコンパクトで読みやすくなります。さらに、メソッド参照スコープでは、メソッド名とクラス名を分離するために解決演算子(::)が使用されます。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
メソッド References の必要性を例を挙げて見てみましょう:
コード:
public class Employee { public enum Sex { MALE, FEMALE } String name; LocalDatejoiningDate; Sex gender; String emailAddress; public int getNumberOfYears() { } public Calendar getJoiningDate() { return joiningDate; } public static int compareByJoiningDate(Employeea, Employeeb) { return a.joiningDate.compareTo(b.joiningDate); }}
そして、joiningDate で誰が最初に参加するかを基準にして従業員のリストを並べ替えたい場合は、サブクラスの 1 つで以下のメソッドを呼び出すことができます。
コード:
Person[] rosterAsArray = roster.toArray(new Employee[roster.size()]); class JoiningDateComparator implements Comparator<Employee> { public int compare(Employeea, Employeeb) { return a.getJoiningDate().compareTo(b.getJoiningDate()); } }
したがって、リストを並べ替えながら 2 人の従業員の入社日を比較する際に、上記のメソッドを呼び出すラムダ式を作成できます。
コード:
Arrays.sort(rosterAsArray, (a, b) ->Person.compareByAge(a, b) );
または、以下の方法でメソッドを呼び出すこともできます。どちらも、配列内のオブジェクトの各ペアのメソッドを呼び出すという同じ意味を持ちます。
コード:
Arrays.sort(rosterAsArray, Person::compareByAge)
JDk 8 には次の 4 種類のメソッド参照が存在します。
:: 演算子を使用した静的メソッドへの参照は、静的メソッドへの参照として知られています。
構文:
ClassName::MethodName()
作業中:
例:
以下の例では、Addition クラスの静的メソッド add が、java.util パッケージの bifunction クラスの機能を使用して呼び出されます。このメソッドの参照は myObj オブジェクトに格納され、必要な値とともに渡されます。引数として渡されます。
コード:
import java.util.function.BiFunction; class Addition{ public static int add(int a, int b){ return a+b; } } public class HelloWorld { public static void main(String[] args) { BiFunction<Integer, Integer, Integer>myObj = Addition::add; int res = myObj.apply(30, 5); System.out.println("Sum of given number is: "+res); } }
出力:
構文:
object::methodName()
作業中:
例:
以下の例では、クラス HelloWorld の showName メソッドが、インスタンス メソッドへのメソッド参照を使用して呼び出されます。
コード:
interface MyInterface{ void display(); } public class HelloWorld { public void showName(){ System.out.println("Call to method ShowName"); } public static void main(String[] args) { HelloWorld obj = new HelloWorld(); MyInterface ref = obj::showName; ref.display(); } }
出力:
構文:
ClassName :: instanceMethodName()
作業中:
例: 以下の例では、配列に格納されているすべての文字列に対して CompareToIgnoreCase メソッドを呼び出しています。したがって、異なるオブジェクトを 1 つずつ渡す代わりに、名簿を使用して 1 つのステートメントでこれが行われます。
コード:
import java.util.Arrays; public class HelloWorld { public static void main(String[] args) { String[] empArray = { "John", "Jack", "Aditya", "Vishal", "Saurabh", "Amanda", "Daniel"}; Arrays.sort(empArray, String::compareToIgnoreCase); System.out.println("Sorted list of names of Employees \n"); for(String str: empArray){ System.out.println(str); } } }
出力:
構文:
myFunc(roster, HashSet<MyClass>::new);
作業中:
以下のメソッドの呼び出しを含み、HashSet の新しいコンストラクターを渡す必要があるラムダ式の例を見てみましょう。
コード:
publicstatic<T, MYSRCextends Collection<T>, MYDESTextends Collection<T>> MYDEST MyMethod( MYSRC src, Supplier< MYDEST>dest) { MYDEST res = collectionFactory.get(); for (T t : src) {res.add(t); } returnres; }
ラムダ式は次のようになります:
コード:
Set<myClass>rosterSet = MyMethod(roster, HashSet::new);
ここで、JRE は渡された引数に myClass タイプのオブジェクトが含まれているか、または以下のラムダ式を使用して次のいずれかを行うことができると自動的に推測します
Set<myClass>rosterSet = transferElements(roster, HashSet<myClass>::new);
Example: In the below example, a constructor of a firstReference class is being called using ‘new’ operator and stored in a reference variable ‘inObj’. This reference variable is then used to refer to the instance methods of this class.
Code:
@FunctionalInterface interface firstInterface{ firstReference show(String say); } class firstReference{ public firstReference(String say){ System.out.print(say); } } public class HelloWorld { public static void main(String[] args) { //Method reference to a constructor firstInterface inObj = firstReference::new; inObj.show("Let’s begin learning Contructor type method reference"); } }
Output:
Method Reference is a way to make a call to an existing method in lambda expressions being used in the application. This feature has been introduced with JDK 1.8 to make lambda expressions more compact and reuse the existing code. There are four ways to make calls to the methods of the class names as shown above.
以上がJava メソッドのリファレンスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。