■ static 메소드 참조
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
public class ArrangeList {
public static void main(String[] args) {
List<Integer> ls = Arrays.asList(1, 3, 5, 7, 9);
ls = new ArrayList<>(ls);
// Consumer<List<Integer>> c = l -> Collections.reverse(l);
/*
* 위 람다식을 다음과 같이 메소드 참조 형태로 만들 수 있다.
*/
Consumer<List<Integer>> c = Collections::reverse;
c.accept(ls);
System.out.println(ls);
}
}
Consumer 인터페이스의 accept 메소드 호출 시 전달되는 인자를 reverse 메소드를 호출하면서 그대로 전달한다.
■ 인스턴스 메소드의 참조 1: 인스턴스가 존재하는 상황에서 참조
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
class JustSort {
public void sort(List<?> lst) {
Collections.reverse(lst);
}
}
public class ArrangeList3 {
public static void main(String[] args) {
List<Integer> ls = Arrays.asList(1, 3, 5, 7, 9);
ls = new ArrayList<>(ls);
JustSort js = new JustSort();
// Consumer<List<Integer>> c = e -> js.sort(e);
/*
* 위 람다식은 다음의 메소드 참조로 대신할 수 있다.
*/
Consumer<List<Integer>> c = js::sort;
c.accept(ls);
System.out.println(ls);
}
}
■ 인스턴스 메소드의 참조 2: 인스턴스 없이 인스턴스 메소드 참조
import java.util.function.ToIntBiFunction;
class IBox {
private int n;
public IBox(int i) {
n = 1;
}
public int larger(IBox b) {
if (n > b.n) {
return n;
} else {
return b.n;
}
}
}
public class NoObjectMethodRef {
public static void main(String[] args) {
IBox ib1 = new IBox(5);
IBox ib2 = new IBox(7);
// 두 상자에 저장된 값 비교하여 더 큰값 반환
// ToIntBiFunction<IBox, IBox> bf = (b1, b2) -> b1.larger(ib2);
/*
* 위 람다식은 다음의 메소드 참조로 대신할 수 있다.
*/
ToIntBiFunction<IBox, IBox> bf = IBox::larger;
int bigNum = bf.applyAsInt(ib1, ib2);
System.out.println(bigNum);
}
}
■ 생성자 참조
interface SMaker {
String make(char[] ar);
}
public class StringMaker {
public static String chsToString(char[] a, SMaker m) {
return m.make(a);
}
public static void main(String[] args) {
// SMaker sm = (ar) -> {
// return new String(ar);
// };
/*
* 위 람다식을 다음의 메소드 참조로 대신할 수 있다.
*/
SMaker sm = String::new;
char[] src = { 'R', 'o', 'b', 'o', 't' };
String str = chsToString(src, sm);
System.out.println(str);
}
}