2016-10-05 6 views
3

콜렉션을 사용할 때 forEach 호출 전에 스트림/병렬 스트림을 삽입해야하는 이유가 있습니까?Java 8 콜렉션 및 스트림/forEach

예 :

Collection<Object> foo; 
foo.forEach(); // Goes through every item in foo 
foo.stream().forEach(); // Does stream make a difference here 
foo.parallelStream().forEach(); // Does this make a difference here? 

감사

+1

forEach는'parallelStream()'또는'parallel()'을 사용하는 경우에만 병렬로 호출됩니다. 이렇게하면 소비자가 아무 것도 변경하지 않거나 스레드로부터 안전한지 확인해야합니다. –

+2

스트림에서'forEach'는 콜렉션에 대해'forEach'와는 다른 의미론을 갖습니다. 요소 순서를 유지하는 것을 보장하지 않으며, 병렬 스트림의 경우 동기화없이 동작을 호출합니다. 'forEachOrdered'는'Collection.forEach'와 비슷하지만, 다른 스트림 동작이 없다면 의미가 없습니다. – Holger

+0

또 다른 차이점은 Collection.forEach는 기본 컬렉션 수정에 대해 더 관대하다는 것입니다. –

답변

3
foo.forEach(); // Goes through every item in foo 
foo.stream().forEach(); // Does stream make a difference here 

지도 나 필터와 같은 스트림 작업이 필요하지 않으면 쓸모가 없습니다.

foo.parallelStream().forEach(); 

이렇게하면 컴퓨터의 모든 논리 코어에 대해 항목을 계산하기위한 새로운 스레드가 생성됩니다. 이 기능의 사용 여부에 대해 두 번 생각해보십시오. 대부분의 경우 장기간 작동하는 경우에만 비용을 지불합니다.

결론 : 그들이 가장 가능성이 스트림 외부 데이터를 변경합니다 루프 A를 변경하지 않고, B를 입력 A 형의 매핑 모음과 같은 부작용없이 사용할 수있을 때 스트림 정말 빛나는.

0

그것은 같은 일을하지만 패러다임이 완전히 다르다.

스트림은 의 기능 프로그래밍의 일부로, 사용자가 수행 할 작업과 수행하지 않는 작업의 관점에서 생각할 수 있습니다.

나는 그것이 추상적으로 들릴지도 모른다는 것을 알고 있지만 실제로는 의미가있다. 따라서 기본적으로 작업은 반복 작업이 아니라 작업에만 중점을 둡니다. Stream()은 filter, map, reduce와 같은 추가 기능을 제공합니다.

그리고 parallelStream을 사용하면 모든 코어를 사용할 수있게되어 매우 멋집니다. 단일 스레드 없이도 멀티 스레드 응용 프로그램을 사용할 수 있습니다. 여분의 코드 행.

+0

그건 내가 묻고있는거야. 내가 명시 적으로 parallelStream()을 호출하면 성능 차이가 발생합니까 아니면 콜렉션이 forEach를 호출 할 때 해당 해석이 해석 되나요? – ekjcfn3902039