Java Supplier 살펴보기 C# 개발자가

몬난아·2021년 8월 14일
0

Supplier를 살펴 보려고 한다.

한 15-20분간 소스를 보고 예제를 찾아봐도 Supplier의 사용하는 경우가 어떤경우인지 도저히 감이 오지 않는다.

먼저 supplier의 사전적인 뜻부터 검색해보니 "공급업체" 이고
인터페이스의 구성요소를 보았을때 get()만 덩그러니 있다.

특정 타입일경우 무조건 해당 값을 반환하는 get()함수를 제공 하고 있는데

기본적인 예제를 구현하는것은 어려운 일은 아니나 사용처가 어떻게 되는지 도저히 감이 오질 않는다.
그래서 깔고 가자면... 이 글은 헛점 투성이가 될가능성이 크지만 일단 기왕시작한거니 작성을 시작하기로 하였습니다

일단 java stream에서 supplier를 호출하는 함수부터 검색해서 찾아보았습니다.

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
public T orElseGet(Supplier<? extends T> supplier) 
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X 

대략적으로 위 3개의 메소드에서 인자로 받아서 사용하고 있었으며 대략적으로 유추 해보았을경우
or의 경우 데이터가 없을경우 기본값을 넘겨받아 해당 supplier에 있는 get()을 넘겨주느코드
orElseGet의 경우도 orElseThrow의 경우도 결국 연산중 null이나 값이 없을때 넘겨준 기본 공급자의 값을 넘게주는 용도라고 이해 했습니다.

기본적으로 이해한것이 맞다면 null 조건 또는 exception발생시에 기본값 지정하는 용도의 인터페이스로 이해하였고 해당 이해도를 바탕으로 예제코드를 작성하였습니다

예제1

Supplier<String> supplier = () -> "not found data";
System.out.println(supplier.get());

"not fund data" 라는 메시지 함수를 만들고 get()호출하여 메시지를 그대로 출력합니다.

예제2

    public static void main(String[] args) {
        Supplier<String> supplier = () -> "not found data";
        
        List<String> list1 = Arrays.asList("a", "b", "c", "d", "e", "f");
        List<String> list2 = Arrays.asList();

        String findChar1 = list1.stream().findAny().orElseGet(supplier);
        String findChar2 = list2.stream().findFirst().orElseGet(supplier);
        System.out.println(findChar1);
        System.out.println(findChar2);
    }

예제1) 에서 만든 메시지를 변수로 남겨 놓고
list2개를 선업합니다.
1번리스트에서 데이터를 찾아서 orElseGet 메소드를 호출하고
2번리스트에서 데이터가 없는 곳에서 orElseGet 메소드를 호출하여 데이터를 찾는 예제입니다

결과는 다음과 같습니다.

데이터가 있는경우는 찾은 첫번째 데이터 "a" 가 출력되었고 반면에
데이터가 없는 리스트에서는 supplier로 넘겨준 데이터 "not found data" 가 출력되었습니다.

다음 코드를 c#코드로 대략 생각하여 구현하면 다음과 같은데
아무래도 null 체크를 코드 중간중간에 자유롭게 가능한 c#코드가.. 너무나 부럽습니다.

    class Program
    {
        public delegate bool Test(int i);

        static void Main(string[] args)
        {
            List<string> list1 = new List<string> { "a", "b", "c", "d", "e"};
            List<string> list2 = new List<string>();

            var result1 = list1.FirstOrDefault() ?? "not found";
            var result2 = list2.FirstOrDefault() ?? "not found";
            System.Console.WriteLine(result1);
            System.Console.WriteLine(result2);
        }
    }

딱히 supplier와 같은 delegate를 선언해줄 필요도 없고.. 필요에 따라 연속성있게 null체크가 가능하고 상황에 따라 바로 타입변환이 가능한점이 아무래도 훨씬 code상에서의 sugar? 적인 표현이 훨씬 유연한 모습으로 보이내요.

일단 java문법 공부가 기본이고 c#코드와 비교해서 이해하는것이 빠르다고 생각해서 비교하는것이니 학습방법이다보니 어쩔수가 없으며 이제 자바 공부를 시작한 2-3일차라 언어에 대한 이해도가 낮아 잘못 표현했을수도 있는점 참고 바랍니다.

금일 supplier는 여기까지 하겠습니다.

profile
잘~ 사는게 목표인사람

0개의 댓글