>Java >java지도 시간 >Java 메소드 참조

Java 메소드 참조

王林
王林원래의
2024-08-30 15:09:10523검색

다음 문서에서는 Java 메소드 참조에 대한 개요를 제공합니다. JDK 8에서는 하나의 작업을 수행하기 위해 한 줄에 익명 메서드를 생성하는 람다 표현식이 도입되었습니다. 하지만 기존 메서드 호출 시 람다 식을 작성할 때 메서드 참조를 사용하면 이러한 작업이 가능해집니다. 이렇게 하면 기존 메서드에 대한 호출이 있는 경우 표현식이 더 간결해지고 읽기 쉬워집니다. 또한 메소드 참조 범위에서는 메소드 이름과 클래스 이름을 구분하기 위해 결정 연산자(:: )를 사용합니다.

무료 소프트웨어 개발 과정 시작

웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등

Java 메소드 참조 유형

예를 들어 메소드 참조의 필요성을 살펴보겠습니다.

코드:

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에는 다음 네 가지 유형의 메소드 참조가 있습니다.

1. 정적 메서드 참조

:: 연산자를 사용하는 정적 메서드에 대한 참조를 정적 메서드에 대한 참조라고 합니다.

구문:

ClassName::MethodName()

일:

  • 여기서 참조되는 메서드는 정적 유형입니다. 즉, 이 메서드를 호출하는 데 클래스 인스턴스가 필요하지 않습니다. 대신 Classname만으로 충분합니다.
  • 따라서 람다 표현식에서 하나의 metionsClassName::MethodName이 있으면 JRE는 해당 클래스로 이동하여 언급된 클래스에서 정적 메서드를 찾습니다. 이는 정적 메서드에 대한 호출이므로 비정적 블록에서 언급할 수 없습니다.

예:

아래 예에서는 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);
}
}

출력:

Java 메소드 참조

2. 특정 객체의 인스턴스 메소드 참조

구문:

object::methodName()

일:

  • 이 유형의 참조에서는 클래스의 객체를 사용하여 인스턴스 메서드 중 하나를 참조합니다. 여기서 JRE는 전달된 인수가 메소드 선언에 언급된 것과 동일한 유형인지 확인합니다.
  • 이것은 클래스의 인스턴스 메서드를 사용하여 람다 식을 작성하는 데 도움이 됩니다.

예:

아래 예에서는 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();
}
}

출력:

Java 메소드 참조

3. 특정 유형의 임의 객체의 인스턴스 메소드에 대한 참조

구문:

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);
}
}
}

출력:

Java 메소드 참조

4. 생성자 참조

구문:

myFunc(roster, HashSet<MyClass>::new);

일:

  • 이 참조 호출은 클래스의 생성자를 호출하기 위해서도 이루어집니다.
  • 이를 위해 'new' 키워드가 람다 표현식에 사용되며 JRE는 해당 특정 클래스의 생성자를 호출하도록 추론합니다.

아래 메서드에 대한 호출이 포함되어 있고 전달될 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:

Java 메소드 참조

Conclusion

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:자바에서 언박싱다음 기사:자바에서 언박싱