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

この種の依存フィルタリングをストリームに行うための「自然な」方法はありますか?あなたはそれをどうやってやりますか?ステートフル依存ストリームのフィルタリング

私がしようとするだろうかザッツ:

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

      }); 

が、私はそれが常にうまくいくと確信していないどちらも良い方法のthats場合イムわからない...

答えて

2

これ、あなたの特定のケースではとのために最新のopenjdkのリリース(jdk + b132)はうまくいきますが、お勧めできません。あなたのindexArraysCollection<SomeClassWithABoxedIntStreamField>である可能性が非常に高いので、stream()メソッドがシーケンシャルストリームを返した場合、干渉は生成されません。

ただし、indexArrays.stream()がパラレルストリームを返す場合は、先にStream::sequentialのシーケンシャルストリームに変換する必要があります。そのストリーム上で作業するかもしれない正しい結果を提供します。

とにかく、この種のコードは実際には推奨されないと将来のJavaのリリースと互換ではないかもしれないが、それはあまりにも、契約を破ります。

PS:IntStreamStream::flatMapToIntをご覧ください。彼らはボクシングとunboxing整数値のコストを拭くことができます。

関連する問題