Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

reduce vs collect #51

Open
yh20studio opened this issue Apr 5, 2022 · 1 comment
Open

reduce vs collect #51

yh20studio opened this issue Apr 5, 2022 · 1 comment
Assignees
Labels
ch6 about chapter 6

Comments

@yh20studio
Copy link

문제

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

선정 배경

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

관련 챕터

  • [6장] 스트림으로 데이터 수집 p.200~207
@yh20studio yh20studio added the ch6 about chapter 6 label Apr 5, 2022
@yh20studio yh20studio self-assigned this Apr 5, 2022
@yh20studio
Copy link
Author

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를 생성하게 되므로 성능적으로 저하가 발생할 것이다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ch6 about chapter 6
Projects
None yet
Development

No branches or pull requests

1 participant