LongStream 필터링 [중복]

Dec 01 2020

두 개의 Java LongStream이 있고 한 스트림에있는 값을 다른 스트림에서 제거하고 싶습니다.

LongStream stream 1 = ...
LongStream stream 2 = ...

stream2  = stream2.filter(e-> stream1.contains(e));

LongStream에는 contains 메서드가 없으며 확인할 값이 다른 스트림에서 나오고 변수 나 상수가 아니기 때문에이 경우 anyMatch를 사용하는 방법을 모릅니다.

답변

1 NikolasCharalambidis Dec 01 2020 at 13:59

음, Stream이 미완성 된 파이프 라인 집합, 즉 작업 인 한 Stream에서 검색 할 수 없습니다. 그러한 스트림과 비교하는 것은 의미가 없습니다.

나에게 이상하게 보이는 다음 것은 아마도 오타 일 것입니다. stream1대신 에서 검색하고 싶다고 가정합니다 stream2.

stream2 = stream2.filter(e -> stream1.contains(e));

유일한 방법 LongStream은를 이러한 검색에 최적화 된 컬렉션과 비교하는 것 입니다. stream1검색을 수행 한 후 계속하려면 다음 단계를 수행하십시오.

  1. 닫기 stream1로 변환 List<Long> list1.
  2. 에서 검색을 수행 stream2하여 list1에서 stream1.
  3. stream1추가 처리를 위해 다시 엽니 다 .
LongStream stream1 = ...
LongStream stream2 = ...

List<Long> list1 = stream1.boxed()                       // list1 from stream1 ..
                          .collect(Collectors.toList()); // .. which also closes stream1

stream2  = stream2.filter(list1::contains);              // perform search

stream1 = list1.stream().mapToLong(l -> l);              // open stream1 as LongStream

편집 :Set @ fps 가 그의 대답 에서 제안한 것처럼 더 나은 성능을 위해 사용하십시오 .

3 fps Dec 01 2020 at 13:48

수집하여 다음 Set을 사용할 수 있습니다 contains.

LongStream stream1 = ...
LongStream stream2 = ...

Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());

stream2 = stream2.filter(set1::contains);
1 UsagiMiyamoto Dec 01 2020 at 14:17

왜 스트림을 사용합니까?

컬렉션에는 retainAll(Collection)내가 잘못하지 않은 경우 필요한 작업을 수행 하는 방법이 있습니다 ...
(또는 removeAll(Collection)약간 위 ...)