-
[Java] Stream map vs Stream foreach vs Collection foreach우아한 테크코스/테크코스 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; }
반응형'우아한 테크코스 > 테크코스' 카테고리의 다른 글
[Java] StackTrace 읽기 (0) 2020.03.05 [Mac] 단축키 기호 및 모음 (0) 2020.03.05 [Vim] Game - pacvim vs VIM Adventures (0) 2020.03.02 [독서] 코딩을 지탱하는 기술 (0) 2020.02.24 [독서] 클린 코더 (0) 2020.02.24