SSAFY-Book-Study / modern-java-in-action

모던 자바 인 액션 북스터디입니다.
1 stars 10 forks source link

2 Weeks - [Collectors.method() vs Stream.method()] #22

Open skagmltn7 opened 1 year ago

skagmltn7 commented 1 year ago

문제

Collectors.method() vs Stream.method() 어느 상황에 사용하는게 좋을까요?

contents - 세부 내용

책을 읽으면서 Stream메소드로 reduce있고 count가 다 있는데 collect()의 매개변수로 counting(), reducing을 사용하는 이유가 궁금했습니다. 어느 상황에 해당 메소드를 사용하는 것이 유용한지 알고싶어요.

DeveloperYard commented 1 year ago

Collectors.method() vs. Stream.method()

reduce

먼저, Collectors class의 메서드와 Stream 인터페이스의 메서드는 모두 Java의 Stream API를 활용해 데이터를 처리하고 조작하는데 사용된다.

이 둘은 기본적으로 수행하는 방식은 같지만 사용방식과 특징에 조금 차이가 있다.

  1. 사용 방식과 문맥:
    • Collectors.reducing(): 이 메서드는 collect() 메서드의 매개변수로 사용되며, 스트림의 요소들을 수집(collect)하여 결과를 생성하는 데에 사용된다.
    • Stream.reduce(): 이 메서드는 Stream 인터페이스에 정의된 메서드로, 스트림의 요소들을 축소하여 단일 결과를 반환하는 데에 사용된다.
  2. 코드 가독성과 명확성:
    • Collectors.reducing(): collect() 메서드를 통해 사용될 때, Collectors.reducing()을 활용하면 작업의 목적을 더 명확하게 표현할 수 있다.
    • Stream.reduce(): Stream 인터페이스의 메서드로 직접 사용할 때는 메서드 호출 자체만으로 작업의 의도를 이해하기 어려울 수 있다.
  3. 유연성과 조합:
    • Collectors.reducing(): collect()의 매개변수로 사용되므로, 다른 수집 작업과 조합하여 복잡한 작업을 수행하기 용이하다.
    • Stream.reduce(): 스트림 자체에 직접 적용되므로, 작업이 비교적 단순하고 직접적인 경우에 유용하다.

count

아래 코드를 실행해보면 차이가 있다는 것을 알 수 있다.


import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamTest {
    public static void main(String[] args) {
        System.out.println(Stream.of(1, 2, 3, 4, 5)
                .map(i -> {
                    System.out.println("processing " + i);
                    return i * 2;
                }).count());

        System.out.println();

        System.out.println(Stream.of(1, 2, 3, 4, 5)
                .map(i -> {
                    System.out.println("processing " + i);
                    return i * 2;
                }).collect(Collectors.counting()));
    }
}```
barded1998 commented 1 year ago

Stream.count()

API Note: An implementation may choose to not execute the stream pipeline (either sequentially or in parallel) if it is capable of computing the count directly from the stream source. In such cases no source elements will be traversed and no intermediate operations will be evaluated. Behavioral parameters with side-effects, which are strongly discouraged except for harmless cases such as debugging, may be affected. For example, consider the following stream:

라고 하네요