2016-06-02 4 views
0
indicesArrays.stream().flatMap(n -> n.indices).sorted().filter(x-> 
//filter x if its diffrence with its predecessor is less then 5; 
) 

스트림에서 이러한 종류의 종속 필터링을 수행하는 "자연스러운"방법이 있습니까? 어떻게 그렇게 할거야? 내가하려고 얼마나Statefull dependent 스트림 필터링

그게 전부 :

indicesArrays.stream().flatMap(n -> n.indices).sorted().filter(new Predicate<Integer>() { 
       Integer lastX = null; 

       @Override 
       public boolean test(Integer t) { 
        if (lastX == null) { 
         lastX = t; 
         return true; 
        } 
        final boolean include = t - lastX >= 5; 
        lastX = t; 
        return include; 
       } 

      }); 

그러나 만약 그게 좋은 방법도 ... 난 확신이 항상 작동 할

답변

2

이 오전, 특정 경우와에 대한 확실하지 메신저 최신 openjdk 릴리스 (jdk + b132)가 작동하지만 권장하지 않습니다. 귀하의 indexArraysCollection<SomeClassWithABoxedIntStreamField> 일 가능성이 매우 높으므로 stream() 메서드가 순차적 스트림을 반환하므로 아무런 간섭이 생성되지 않습니다.

그러나 indexArrays.stream()이 병렬 스트림을 반환하는 경우 먼저 Stream::sequential의 순차 스트림으로 변환해야합니다. 해당 스트림에서 작업하면 일 수 있으며 일 때 올바른 결과를 얻을 수 있습니다.

어쨌든, 이런 종류의 코드는 실제로 권장되지 않으며 일 수 있습니다.은 향후 Java 릴리스와 호환되지 않을 수 있습니다.

추 신 : IntStreamStream::flatMapToInt을 살펴보십시오. 그들은 복싱 및 정수 값 unboxing의 비용을 닦을 수 있습니다.

관련 문제