가자미의 개발이야기

자바 메소드 참조 본문

Java/자바 기본 문법

자바 메소드 참조

가자미 2021. 2. 9. 08:39

-메소드 참조는 특수한 상황일 때, 람다식을 좀 더 줄일 수 있는 표현이다.

-일종의 약속이니 예제에서 약속을 파악하자.

 

-static 메소드 참조

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
 
interface Consumer<T>{
    void accept(T t);
}
public class ArrangeList {
    public static void main(String[] args) {
        List<Integer> ls = Arrays.asList(13579);
        ls = new ArrayList<>(ls);
        //Collection 클래스의 public static void reverse 메소드를 전달.
        
        Consumer<List<Integer>> c = Collections::reverse;//메소드 참조식 표현.
        //Consumer<List<Integer>> c = l->Collections.reverse(l);//람다식 표현.
        //accept메소드 호출 때 전달되는 인자를 reverse메소드에 그대로 전달.
        
        c.accept(ls);
        System.out.println(ls);
    }
}
cs

-인스턴스 메소드 참조

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
 
interface Consumer<T>{
    void accept(T t);}
 
class JustSort{
    public void sort(List<?> lst) {
        Collections.reverse(lst);
    }
}
public class ArrangeList {
    public static void main(String[] args) {
        List<Integer> ls = Arrays.asList(13579);
        ls = new ArrayList<>(ls);
        JustSort js = new JustSort();    //js는 effectively final. 실제로 상수는 아니지만, 코드 내에서 변경되지 않는 사실상 상수.
        
        Consumer<List<Integer>> c = js::sort;//메소드 참조식 표현.
        //Consumer<List<Integer>> c = e->js.sort(e);//람다식 표현.
        //accept메소드 호출 때 전달되는 인자를 메소드에 그대로 전달.
        
        c.accept(ls);
        System.out.println(ls);
    }
}
cs

-인스턴스 없이 인스턴스 메소드 참조

--첫번째 인자의 인스턴스 메소드에 두번째 인자를 해당 메소드의 인자로 사용할 때만!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
interface ToIntBiFunction<T,U>{
    int applyAsInt(T t, U u);
}
 
class IBox{
    private int n;
    public IBox(int i) {n=i;}
    public int larger(IBox b) {
        if (n>b.n)
            return n;
        else
            return b.n;
    }
}
 
public class InstanceMethod {
    public static void main(String[] args) {
        IBox ib1 = new IBox(5);
        IBox ib2 = new IBox(7);
        //람다식 표현
        //ToIntBiFunction<IBox, IBox> bf = (b1,b2)->b1.larger(b2);
        //메소드 참조식 표현
        ToIntBiFunction<IBox, IBox> bf = IBox::larger; //약속에 근거
        int bignum = bf.applyAsInt(ib1, ib2);
        System.out.println(bignum);
    }
}
 
cs

-생상자 참조

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.function.Function;
 
public class StringMaker {
    public static void main(String[] args) {
        //람다식 표현
        //Function<char[], String> f = ar->{return new String(ar);};
        //생생자 참조식 표현
        Function<char[], String> f = String::new;
        char[] src = {'R''o''b''o''t'};
        String str = f.apply(src);
        System.out.println(str);
    }
}
cs