Open yh20studio opened 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
를 생성하게 되므로 성능적으로 저하가 발생할 것이다.
문제
책 초반 부에서 나오는 reduce 와 collect 부분에서 비슷한 연산을 수행할 수 있지만 어떤 차이가 있을까?
선정 배경
collect의 내부적으로 reduce 연산이 된다고 하는데 어떤 차이가 있을까?
관련 챕터