2014-10-13 2 views
0

두 개의 Stream을 병합하여 목록을 채우고 일부 작업을 수행 한 다음 모든 요소를 ​​가져 와서 저장하고 싶습니다. 두 가지 접근 방식은 내 마음에 온 :여러 요소를 추가하는 Collector 또는 ForEach

수집 :

myList.addAll(Stream.concat(stream1, stream2) 
    .flatMap(foo -> someMethod(foo).stream()) 
    .collect(Collectors.toList())); 

를 ForEach :

Stream.concat(stream1, stream2) 
    .flatMap(foo -> someMethod(foo).stream()) 
    .forEach(myList::add); 

사용에서 하나 개의 솔루션을 expells 성능에 차이가 있습니까?

수집기를 사용하는 첫 번째 수집자가 즉시 소비되고 List#addAll에 의해 삭제되는 임시 목록을 만드나요?

수정 이 질문은 어떻게 든 기능 및/또는 성능을 설명하는 대답을 생성하기위한 것입니다. 나는 어떤면에서 "더 잘 어울리는가"등에 대한 토론을 시작하고 싶지 않습니다. 그것은 높은 의견을 바탕으로합니다.

답변

1

저는 스트림 API에 대한 전문가는 아니지만 더 많은 정보가 있기 때문에 collect이 더 나은 선택이라고 기대합니다. foreach 접근 방식은 myList에 적당한 크기를 할당, 사전에 스트림의 크기를 알 수 없다

이론의 collect 접근 방식이 최적화를 만들기 위해 사용할 수있는 추가 정보에 액세스 할 수 있습니다. 가능하다면 일반적으로 전체 작업을 한 번에 수행하는 메서드를 반복하는 것보다는 사용하는 것이 좋습니다. 최악의 경우 시나리오는 내부적으로 반복 만 수행합니다.

오래된 학교 수거 과정에서와 마찬가지로 x을 반복하고 각 요소를 추가하는 대신 list.addAll(x)을 선호합니다. addAll은 잘 모르는 최적화를 할 가능성이 있으며, 최악의 경우 수동 반복과 동일한 성능이 될 것입니다.

+0

@Holger 예, 그게 내 뜻이었습니다. "myList"에 맞는 크기를 할당해라. –

+0

아, 나는 "forEach method"에 대해 "foreach approach"라고 오인했다. 왜냐하면 문장은 일반적인 방법론과 같이 공식화되기 때문이다. – Holger

관련 문제