우아한 테크코스/테크코스

[Java] Stream map vs Stream foreach vs Collection foreach

jamie. 2020. 3. 5. 00:07
반응형

For Loop문

 수동 로또를 만드는 메서드를 아래와 같이 작성을 했었는데, foreach나 map을 적용해봐도 좋을 것 같다고하여 적용 해보면서 간단하게 정리. 나름 직관적인 코드라고 생각했지만, 아래 방법들이 더 직관적으로 들어온다.

private static List<Lotto> createManualLottos(List<String> manualLotto, LottoCount count) {
    List<Lotto> lottos = new ArrayList<>();
    int lottoCount = manualLotto.size();
    for (int index = 0; index < lottoCount; index++) {
        lottos.add(LottoFactory.createManual(manualLotto.get(index)));
    }
    return lottos;
}

Stream Map 이용

 스트림의 값 자체를 변경

private static List<Lotto> createManualLottos(List<String> manualLotto, LottoCount count) {
    return manualLotto.stream()
        .map(Lotto::of)
        .collect(Collectors.toList());
}

Foreach 이용

 값 자체를 변경하는 것이 아닌, 값을 꺼내서 그 값으로 작업을 하는 것

 Iterable.foreach(Consumer<? super T> action) -> 처리 순서 보장

/* 함수형 프로그래밍 사용시 Collection.forEach 사용 */
private static List<Lotto> createManualLottos(List<String> manualLotto, LottoCount count) {
    List<Lotto> lottos = new ArrayList<>();
    manualLotto.forEach(lotto -> lottos.add(Lotto.of(lotto)));
    return lottos;
}

/* 아래와 같음 */
for (string lotto : manualLotto) {
    lottos.add(Lotto.of(lotto));
}

Stream Foreach 이용 - 지양

 for-loop보다 오버헤드가 많이 발생하여, CPU 낭비 발생

 Stream.forEach(Consumer<? super T> action)

처리 순서 보장하지 않음

 병렬 스레드에서 예상치 못한 상황이 발생할 수 있음 

 > 함수형 인터페이스는 디버깅이 어려울 수 있는데 맞물리면 좋지 않을 듯

private static List<Lotto> createManualLottos(List<String> manualLotto, LottoCount count) {
    List<Lotto> lottos = new ArrayList<>();
    manualLotto.stream()
        .forEach(lotto -> lottos.add(Lotto.of(lotto)));
    return lottos;
}
반응형