Java 8 Stream의 내용을 List에 여러 번 추가하는 코드를 작성해야하며,이를 수행하는 가장 좋은 방법을 알아내는 데 어려움이 있습니다. 다른 곳에서, 나는 다음과 같은 옵션을 좁혀했습니다 : 나는 SO (How to add elements of a Java8 stream into an existing List 주로이 질문에) :에 읽은 것을 바탕으로스트림의 요소를 기존 목록에 추가하는 더 좋은 방법은 무엇입니까?
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Accumulator<S, T> {
private final Function<S, T> transformation;
private final List<T> internalList = new ArrayList<T>();
public Accumulator(Function<S, T> transformation) {
this.transformation = transformation;
}
public void option1(List<S> newBatch) {
internalList.addAll(newBatch.stream().map(transformation).collect(Collectors.toList()));
}
public void option2(List<S> newBatch) {
newBatch.stream().map(transformation).forEach(internalList::add);
}
}
아이디어는 방법은 동일한 인스턴스에 대해 여러 번 호출 할 것입니다
Accumulator
. 중간 목록을 사용하고 스트림 외부에서 Collection.addAll()
을 한 번 호출하거나 각 요소의 스트림에서 collection.add()
을 호출하는 것 중에서 선택합니다.
기능적 프로그래밍의 정신에서 더 많은 옵션 2를 선호하는 경향이 있으며 중간 목록을 만들지는 않지만 n이 클 때 add()
번을 호출하는 대신 addAll()
을 호출하면 이점이있을 수 있습니다.
두 옵션 중 하나가 다른 옵션보다 훨씬 좋습니까?
EDIT : JB Nizet은 모든 배치가 추가 될 때까지 변환을 지연시키는 매우 차가운 answer을 가지고 있습니다. 필자의 경우 변환이 곧바로 수행되어야합니다.
PS는 : 내 예제 코드에서, 나는 스트림
분해 된 바이트 코드 (javap)는 –
조숙 한 최적화를 수행하지 마십시오. 무엇보다 깨끗하고, 성능 문제가 발생한 경우에만이 코드를 프로파일 러로 확인하십시오. –
'addAll()'을 호출 할 때 어떤 이점도 있다고 생각하지 않습니다. – shmosel