동일한 유형의 두 개의 Java 8 스트림이있는 경우이 두 스트림의 대칭 차이를 새 스트림으로 효율적으로 가져 오는 방법은 무엇입니까?
효율적인 방법을 찾을 수 없었습니다. 내가 관리 한 최고는
static <T> Stream<T> symmetricDifference(Stream<T> stream1, Stream<T> stream2) {
Set<T> elements1 = stream1.collect(Collectors.toSet());
Set<T> elements2 = stream2.collect(Collectors.toSet());
Set<T> result = new HashSet<T>(elements1);
result.addAll(elements2);
elements1.retainAll(elements2);
result.removeAll(elements1);
return result.stream();
}
아마 당신이 이미 생각 해낸 해결책 일 것입니다.
대칭 적 차이를 찾기 위해 스트림 연산을 사용하려고 할 때에도 스트림을 여러 번 반복해야하는 문제를 극복하기 위해 많은 임시 스트림과 세트를 생성해야한다는 것을 알게되었습니다. 다음은 Stream
스트림 작업 만 사용하여 대칭 차이를 포함하는 을 생성하는 버전입니다 . 훨씬 더 비효율적이라는 것을 알 수 있습니다.
static <T> Stream<T> disjointStream(Stream<T> stream1, Stream<T> stream2) {
Set<T> elements1 = stream1.collect(Collectors.toSet());
Set<T> elements2 = stream2.collect(Collectors.toSet());
Set<T> elementsIn1Notin2 = elements1.stream().filter(t -> !elements2.stream().anyMatch(Predicate.isEqual(t))).collect(Collectors.toSet());
Set<T> elementsIn2Notin1 = elements2.stream().filter(t -> !elements1.stream().anyMatch(Predicate.isEqual(t))).collect(Collectors.toSet());
return Stream.concat(elementsIn1Notin2.stream(), elementsIn2Notin1.stream());
}
스트림 작업 만 유지하면서 개선 할 수있는 방법을보고 싶기 때문에이 문제를 제기하고 있습니다 (아니오 Set
또는 Collection
작업과 별도로 작업 Collection.stream()
). 그리고 내 투박한 구문이 어떻게 향상 될 수 있는지.
제쳐두고, Java 8에 막 들어가서 이러한 클래스가 어디에 있는지 궁금해하는 사람들을 위해 내 가져 오기는 다음과 같습니다.
import java.util.HashSet;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다