메소드 참조 (Method Reference)
메소드 참조는 람다 표현식의 특별한 타입중 하나이다.
이미 구현되어 있는 메소드를 참조함으로써, 람다식을 좀 더 심플하게 만들 때 사용된다.
4가지 타입의 메소드 참조가 있다.
1. 정적 메소드 참조
문법
ContainingClass::staticMethodName
정적 메소드가 포함된 클래스::정적 메소드명
예제
// 람다식으로 list의 원소 절대값 만들기
List<Integer> list = Arrays.asList(1, -5, 2, -7, -3);
list.stream().map(num -> Math.abs(num))
.forEach(num -> System.out.println(num));
// 정적 메소드 참조로 변경
list.stream().map(Math::abs)
.forEach(num -> System.out.println(num));
2. 특정 객체의 인스턴스 메소드 참조
문법
containingObject::instanceMethodName
메소드가 포함된 객체::메소드명
예제
class Node {
public int x;
public int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
public String toString(){
return "x: " + x +", y: " + y;
}
}
class NodeComparator implements Comparator<Node> {
@Override
public int compare(Node o1, Node o2) {
return o1.x - o2.x;
}
}
List<Node> nodes = new ArrayList<Node>();
nodes.add(new Node(3, 6));
nodes.add(new Node(1, 3));
nodes.add(new Node(6, 5));
nodes.add(new Node(12, 2));
NodeComparator nodeComparator = new NodeComparator();
// 람다식으로 정렬
nodes.stream().sorted((a, b) -> nodeComparator.compare(a, b))
.forEach(node -> System.out.println(node.toString()));
// 인스턴스 메소드 참조로 정렬
nodes.stream().sorted(nodeComparator::compare)
.forEach(node -> System.out.println(node.toString()));
3. 특정 유형의 임의 객체 메소드에 대한 참조
(Reference to an Instance Method of an Arbitrary Object of a Particular Type)
문법
ContainingType::methodName
타입::메소드명
예제
List<String> words = Arrays.asList("ABC", "CD", "EFG");
// 인자로 넘어온 객체의 메소드를 호출
// 람다식으로 표현
words.stream().map(word -> word.toLowerCase())
.forEach(word -> System.out.println(word));
// 메소드 참조로 표현
words.stream().map(String::toLowerCase)
.forEach(word -> System.out.println(word));
arbitary object (임의 객체)라는 용어가 사용된 이유는, 메소드 참조가 실행될 때마다 인자로 넘어온 객체가 다를 수 있기 때문이다.
참고
4. 생성자 참조
문법
ClassName::new
클래스명::new
예제
public class Node {
int x;
int y;
public Node(int x, int y){
this.x = x;
this.y = y;
}
public String toString(){
return "x:" + x+ ", y:"+y;
}
}
// 람다식
BiFunction<Integer, Integer, Node> functionFunc1 = (a, b) -> new Node(a, b);
System.out.println(functionFunc1.apply(1, 3).toString());
// 생성자 참조
BiFunction<Integer, Integer, Node> functionFunc2 = Node::new;
System.out.println(functionFunc1.apply(5, 6).toString());
참고
https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
https://www.baeldung.com/java-method-references
'💻IT > Java' 카테고리의 다른 글
[Java] Java 8 Functional Interface (0) | 2021.12.10 |
---|---|
[Java] Java 8 Optional (0) | 2021.12.09 |
[Java] Java 8 Stream API (0) | 2021.12.03 |
[Java] Deque 자료 구조 (LinkedList 메소드) (0) | 2021.11.15 |
[Java] Convert Array to List / Convert List to Array (0) | 2021.10.18 |