본문 바로가기
Language/Java

메소드 참조

by Zayne 2023. 3. 6.

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

'Language > Java' 카테고리의 다른 글

스트림  (0) 2023.03.08
Optional 클래스  (0) 2023.03.07
함수형 인터페이스  (0) 2023.03.03
람다 2  (0) 2023.03.02
람다 1  (0) 2023.02.28