우아한 테크코스/테크코스
[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;
}
반응형