본문 바로가기
백엔드

[Java] Collection.stream().forEach() 와 Collection.forEach() 의 차이

by BeforB 2022. 6. 27.
728x90

 

 

* 아래 링크를 참고하여 번역 및 내용을 추가하여 정리하였습니다.

https://www.geeksforgeeks.org/difference-between-collection-stream-foreach-and-collection-foreach-in-java/?ref=rp 

 

Difference Between Collection.stream().forEach() and Collection.forEach() in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

 

 

Java에서 forEach를 사용하다가 궁금한 점이 생겨 검색해보았는데 마침 정리가 잘 된 글이 있어 정리해서 공유해본다.

 

 

Collection.stream().forEach() 와 Collection.forEach()의 차이점을 알아보자.

두 방식은 크게 다르지 않고 같은 결과를 출력하지만 내부 동작 방식에 몇 가지 차이점이 있다.

 

 

Collection.stream().forEach()

  • Collection객체를 스트림으로 변환 후 collection의 stream에서 반복한다.
  • 반복할 때마다 collection에 구조적 변경이 일어나면 iterator가 완료된 후 concurrent modification exception이 발생한다.
  • 동기화된 컬렉션에 반복이 발생하더라도 lock이 걸리지 않는다.

 

Collection.forEach()

  • Collection 자체의 iterator를 사용한다.
  • 반복이 일어나는 동안 구조적 변경을 허용하지 않는다. element를 추가하거나 제거하는 등의 collection에 변경이 일어날 경우 즉시 concurrent modification error를 던진다.
  • Collection.forEach()는 동기화된 컬렉션에서 반복이 일어나면 lock이 걸린다.

 

 

foreach안에서 collection 수정이 발생할 경우 결과 비교

// Collection 생성
List<String> fruits = new ArrayList<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("peach");

 

1) Collection.stream().forEach()

fruits.stream().forEach(e -> {
	System.out.println(e);
	fruits.add("Collection.stream().forEach()");
});

// 실행결과 - forEach가 모두 실행되고 난 후 에러 발생
apple
banana
peach
Exception in thread "main" java.util.ConcurrentModificationException
		at java.base/java.util.ArrayList.forEach(ArrayList.java:1542)
		at test.java.CollectionTest.main(CollectionTest.java:20)

 

 

2) Collection.forEach()

fruits.forEach(e -> {
	System.out.println(e);
	fruits.add("Collection.forEach()");
});

// 실행결과 - 즉시 에러 발생
apple
Exception in thread "main" java.util.ConcurrentModificationException
		at java.base/java.util.ArrayList.forEach(ArrayList.java:1542)
		at test.java.CollectionTest.main(CollectionTest.java:20)

 

 

 

728x90

댓글