메서드 참조
사전지식
Function <String> <Integer> f
String : 매개변수 타입
Integer : 리턴타입
메서드 참조 목적 : 람다식을 더 간결하게 만들기 위함
- 람다식 : (left, right) → Math.max(left, right)
- 메서드 참조 : Math::max
종종 람다식은 기존 메서드를 단순하게 호출하는 경우가 있다.
길게 쓸 필요가 없다. 간결하게 쓰자
1. 인스턴스 메서드 참조
람다식 : (a, b) → a.메서드이름(b)
메서드 참조 : 클래스이름::메서드이름
Function<String, Integer> f = (a,b) → a.myMethod(b); //람다식(익명 구현 객체)
Function<String, Integer> f = String::myMethod; //메서드 참조(익명 구현 객체)
*String은 매개변수 a의 타입을 나타냄
2. static 메서드 참조
람다식 : (x) → 클래스이름.메서드이름(x)
메서드 참조 : 클래스이름::메서드이름
Function<String, Integer> f = (String s) -> Integer.parseInt(s); //람다식 (익명 구현 객체)
Function<String, Integer> f = Integer::parseInt; //메서드 참조 (익명 구현 객체)
3. 생성자 메서드 참조 ※생성자는 리턴값이 없다. 그러나 객체를 생성한다.
람다식 : (a, b) → { return new 클래스(a,b); }
생성자 메서드 참조 : 클래스::new
아래의 코드를 참고하자
class Member {
private String id;
private String name;
public Member() {}
public Member(String id) {
this.id = id;
}
public Member(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() { return id; }
public String getName() { return name; }
}
1) 생성자 메서드 참조 (매개변수가 0개인 생성자)
Function<Member> f = () → new Member(); //람다식 (익명구현객체)
Function<String, Member> f = Member::new; //메서드 참조 (익명구현객체)
* Member 생성자가 호출한 생성자는 매개변수를 갖지 않는 Member() 기본 생성자이다.
2) 생성자 메서드 참조 (매개변수가 1개인 생성자)
Function<String, Member> f = ( id) → new Member(id); //람다식 (익명구현객체)
Function<String, Member> f = Member::new; //메서드참조(익명구현객체)
* Member 생성자가 호출한 생성자는 매개변수를 String타입으로 1개 가지고 있는 Member(String id) 생성자이다.
3) 생성자 메서드 참조 (매개변수가 2개인 생성자)
BiFunction<String, String, Member> f = ( id, name) →new Member(id, name); //람다식(익명구현객체)
BiFunction<String, String, Member> f = Member::new; //메서드참조(익명구현객체)
*Member 생성자가 호출한 생성자는 매개변수를 String타입으로 2개 가지고 있는 Member(String id, String name)생성자이다.
4) 배열과 생성자 메서드 참조
1단계 - 함수형 인터페이스의 추상메서드 array를 익명구현객체를 이용하여 오버라이딩 한다.
@FunctionalInterface
public interface MyFunction {
public abstract int[] array(int x); // 매개변수 없음, 리턴값이 없음
}
class Lambda {
public static void main(String[] args) {
MyFunction f = new MyFunction() {
@Override
public int[] array(int x) {
return new int[x];
}
};
}
}
2단계 -익명구현객체를 람다식으로 전환
@FunctionalInterface
public interface MyFunction {
public abstract int[] array(int x); // 매개변수 없음, 리턴값이 없음
}
class Lambda {
public static void main(String[] args) {
MyFunction f = x -> new int[x];
}
}
3단계 - 람다식을 메서드 참조로 바뀌 보자
@FunctionalInterface
public interface MyFunction {
public abstract int[] array(int x); // 매개변수 없음, 리턴값이 없음
}
class Lambda {
public static void main(String[] args) {
MyFunction f = int[]::new;
}
}
'자바 > Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글
Stream (0) | 2022.10.31 |
---|---|
Optional <T> (0) | 2022.10.30 |
람다 Lambda (0) | 2022.10.30 |
Comparable (0) | 2022.10.27 |
생성자 (0) | 2022.10.26 |