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

Gibt es eine "natürliche" Möglichkeit, diese Art von abhängiger Filterung in einem Stream durchzuführen? Wie würdest du es richtig machen?Statusabhängig Filterung eines Streams

Das ist, wie ich würde versuchen:

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; 
       } 

      }); 

aber im, wenn das ist ein guter Ansatz nicht sicher, weder bin ich sicher, dass es immer ... Diese, in Ihrem speziellen Fall und für die funktionieren würde

Antwort

2

neueste Openjdk-Version zu der Zeit (jdk + b132), wird funktionieren, aber es wird nicht empfohlen. Da Ihre indexArrays sehr wahrscheinlich eine Collection<SomeClassWithABoxedIntStreamField> ist, deren stream() Methode einen sequenziellen Stream zurückgibt, kann keine Interferenz erzeugt werden.

Wenn indexArrays.stream() jedoch einen parallelen Stream zurückgibt, müssen Sie ihn zuerst in einen sequenziellen Stream mit Stream::sequential umwandeln. Arbeiten an diesem Strom kann das richtige Ergebnis geben.

Wie auch immer, diese Art von Code ist wirklich nicht zu empfehlen und Mai nicht kompatibel mit zukünftigen Java-Releases, brechen sie auch den Vertrag.

PS: werfen Sie einen Blick auf IntStream und Stream::flatMapToInt. Sie können die Kosten für das Boxen und Unboxing ganzer Werte wischen.