다음 문서에서는 Java 메소드 참조에 대한 개요를 제공합니다. JDK 8에서는 하나의 작업을 수행하기 위해 한 줄에 익명 메서드를 생성하는 람다 표현식이 도입되었습니다. 하지만 기존 메서드 호출 시 람다 식을 작성할 때 메서드 참조를 사용하면 이러한 작업이 가능해집니다. 이렇게 하면 기존 메서드에 대한 호출이 있는 경우 표현식이 더 간결해지고 읽기 쉬워집니다. 또한 메소드 참조 범위에서는 메소드 이름과 클래스 이름을 구분하기 위해 결정 연산자(:: )를 사용합니다.
무료 소프트웨어 개발 과정 시작
웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등
예를 들어 메소드 참조의 필요성을 살펴보겠습니다.
코드:
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); }}
그리고 합류 날짜를 기준으로 직원 목록을 정렬하려면 누가 먼저 합류했는지를 기준으로 하위 클래스 중 하나에서 아래 제공된 메서드를 호출하면 됩니다.
코드:
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에는 다음 네 가지 유형의 메소드 참조가 있습니다.
:: 연산자를 사용하는 정적 메서드에 대한 참조를 정적 메서드에 대한 참조라고 합니다.
구문:
ClassName::MethodName()
일:
예:
아래 예에서는 Addition 클래스의 정적 메소드 add가 java.util 패키지의 이중 기능 클래스 기능을 사용하여 호출됩니다. 여기서 이 메소드의 참조는 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 메서드를 호출합니다. 따라서 서로 다른 객체를 하나씩 전달하는 대신 명단을 사용하는 단일 명령문에서 이 작업이 수행됩니다.
코드:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!