woowacourse-study / 2022-modern-java-in-action

우아한테크코스 4기 모던 자바 인 액션 스터디
10 stars 4 forks source link

reduce vs collect #51

Open yh20studio opened 2 years ago

yh20studio commented 2 years ago

문제

책 초반 부에서 나오는 reduce 와 collect 부분에서 비슷한 연산을 수행할 수 있지만 어떤 차이가 있을까?

선정 배경

collect의 내부적으로 reduce 연산이 된다고 하는데 어떤 차이가 있을까?

관련 챕터

yh20studio commented 2 years ago

reduce는 두 값을 하나로 도출하는 불변형 연산이다.

Optional<T> reduce(BinaryOperator<T> accumulator);
<U> U reduce(U identity,
    BiFunction<U, ? super T, U> accumulator,
    BinaryOperator<U> combiner);


반면 collect는 도출하려는 결과를 누적하는 컨테이너를 바꾸도록 설계되어 있는 가변 연산이다.

<R> R collect(Supplier<R> supplier,
    BiConsumer<R, ? super T> accumulator,
    BiConsumer<R, R> combiner);

여기서 알 수 있는 점은 accumulator가 다르다는 것이다. Reduce : BiFunction Collect: BiConsumer

BiFunction은 return 값이 존재하기 때문에 두 개의 인수값을 기준으로 새로운 객체를 생성하는 방식이다.

이는 마치 불변 객체를 만드는 방식과 비슷하다. 즉 reduce 메서드를 이용하게 된다면 불변 객체를 만드는 방식으로 연산이 진행된다는 점이다.

BiConsumer는 return 값이 void이기 때문에 내부에서 가변 컨테이너가 존재하고, 이 컨테이너가 변하고 있다는 것이다.

이 두 가지의 방식이 차이점을 내고 있다. 따라서 만약에 책과 같이 toList를 해주는 연산을 reduce로 진행하게 된다면 매번 새로운 list를 생성하게 되므로 성능적으로 저하가 발생할 것이다.