du.study기록공간

Java @FunctionalInterface - Consumer 본문

자바

Java @FunctionalInterface - Consumer

du.study 2021. 11. 17. 22:54
728x90

이직 후, 너무 게시글 작성이 뜸해져서 스스로 습관도 들일겸, 기존에 쓰던 내용도 정리할겸

이번엔 java lambda에 대해 하나씩 정리해보려합니다.

 

그중에서 이번엔 Consumer를 기록하고자합니다.

Consumer는 리턴값이 void이며, 특정 타입을 받아 해당 값을 사용하는 것이 특입니다.

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

간단한 예시를 들자면 다음과 같습니다.

Consumer<String> consumer = s -> System.out.println(s);
// Consumer<String> consumer = System.out::println; 윗 줄과 동일한 코드
consumer.accept("hello world");
 

 

그렇다면 위에 있는 default method인 andThen은 어떻게 쓰이는가 하면 Consumer를 서로 체이닝 시켜주는 역할을 합니다. 이번에도 예시를 들어보겠습니다.
// andThen TEST
List<Integer> ints = Arrays.asList(1,2,3);

Consumer<List<Integer>> doubleNumber = list -> {
   for (int i = 0; i < list.size(); i++) {
      list.set(i, list.get(i)*list.get(i));
   }
};

Consumer<List<Integer>> println = list -> {
   for (Integer fruit : list) {
       System.out.println(fruit);
   }
};
doubleNumber.andThen(println).accept(ints);


결과
1
4
9

값으로 쓰일 부분을 accept에 넘겨주고, 맨앞의 doubleNumber 가 실행되고 그다음 println이 실행되는 그런 구조입니다.

물론 andThen을 체이닝 하여 더 추가할 수도 있습니다.

 

------------------

 

 

저같은경우, protobuf를 사용하는 과정에서 StringValue를 set하는 과정에 builder를 사용하게 됩니다. 이때 StringValue를 null로 세팅하는 경우 에러가 발생하여 꼭 if조건이 필요하게 됩니다.

이때 if( notnull 확인 ) -> set하는 과정을 consumer 인자로 받는 메서드를 두고, 한줄로 처리할때 주로 사용하고 있습니다.

예시를 들자면 다음과 같은 경우입니다.

public class ConsumerExample {

    public static void main(String[] args) {

        ConsumerDto test1 = new ConsumerDto();
        ConsumerDto test2 = new ConsumerDto();

        ifPresent("name1", test1::setName);
        ifPresent(null, test2::setName);

        System.out.println(test1.getName());
        System.out.println(test2.getName());
    }


    public static void ifPresent(String str, Consumer<String> consumer){
        // StringUtils 를 임포트 안해놔서..
        if(str != null){
            consumer.accept(str);
        }
    }
}

class ConsumerDto{
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

우선 예시를 든다고 메인에 뒀기에 static이 들어가지만..  결국 코드를 코면 한줄로 반복되는 코드를 줄일 수 있습니다.

 

 

예제 코드 : https://github.com/pesang72/java-example/blob/master/src/main/java/du/study/lambda/ConsumerExample.java

728x90
Comments