티스토리 뷰
예전에 미션 피드백을 받고 인지해 정리했던 내용을 포스팅
Collection.stream().forEach() vs Collection.forEach()
- 순서
- Collection.forEach는 컬렉션의 iterator를 사용한다. 따라서 순서가 명확하다.
- 반면 Stream.forEach는 순서가 명확하지 않다. 순차스트림이라면 보통 순서대로 실행되지만 병렬스트림이라면 순서가 보장되지 않는다.
- Collection 수정과 Side Effect
- Collection.forEach는 iter동안 구조적으로 변경되어선 안된다. 순회하는 동안 요소가 추가/삭제되면 ConcurrentModification Execption이 발생한다. 동시에 컬렉션은 fail-fast하게 설계되었다. 즉 변경이 발생하면 바로 예외가 던져진다.
- 한편 Stream.forEach는 스트림 파이프라인동안 요소가 추가/삭제되면 마찬가지로 ConcurrentModification Exception을 발생시키지만 나중에 던져진다.
- 추가로, Collection.forEach는 iter동안 요소값이 변경되는것이 허용되지만 Stream.forEach는 non-interfering을 요구. Stream.forEach에서도 값변경이 되긴하지만 권장되지않는다. 예상치못한 결과로 이어질수있음.
- 동기화
- synchronized collection을 순회할때, Collection.forEach는 락을 걸고 Stream.forEach는 spliterator를 사용해서 Lock을 걸지 않는다.
결론
사실 차이는 미미하다. 특별한 요구사항이 있는게 아니라면 그냥 Collection.forEach를 사용하자. 굳이 Collection.Stream.forEach말고
'General, Java' 카테고리의 다른 글
| FilenameUtils를 이용한 파일 확장자 검사 (Apache Commons IO 2.5 API) (0) | 2019.09.14 |
|---|---|
| Singleton vs Static class 차이점 (0) | 2019.09.14 |
| DTO의 사용범위 / Entity와의 변환에 대한 논의 (0) | 2019.09.14 |
| Java) toString()을 override하는 10가지 팁 (번역/요약) (0) | 2019.09.14 |
| Dependency Injection (basic) (0) | 2019.09.14 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- mysql
- queue
- sort
- OneToMany
- JPA
- dfs
- 회고
- 개발자
- Algorithm
- FRAGMENT
- Vo
- reversing
- C
- 프로그래머스
- git
- javascript
- graph
- 해외여행
- brute-force
- Stack
- Android
- bfs
- Data Structure
- Java
- webhacking.kr
- Android Studio
- 웹해킹
- 우아한 테크코스
- socket
- 리버싱
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
글 보관함