2016-09-29 14 views
-1

私は良いタイトルで達成したい目標をどのように記述するのか分かりません。私はそれぞれがブール値のメンバーを持つオブジェクトのリストを持っています。このリストをフィルタリングしてリストの最初のオブジェクトの最後に、このブールメンバーがtrueに設定されているオブジェクトを取得します。Javaストリーム - 連続する同じフィールドのオブジェクトを取得する

これはストリームなしで行う方法です。すべてのオブジェクトをgetterメソッドがtrueを返す新しいリストに追加し、最初の要素がfalseを返すときに停止します。

int i = 0; 
while(i < list.size()){ 
    if(!list.get(i).isMemberTrue()){ 
     break; 
    } 
    else{ 
     newList.add(list.get(i)); 
    } 
    i++; 
} 

これは何とかシーケンシャルストリームで可能ですか?

+0

'list.stream()。フィルタ(member->メンバー:: isMemberTrue).findFirst()' – emotionlessbananas

+0

もう一つのリストから、とにかくあなたの最初の 'member'がメンバーでない場合、あなたのループは' break'ますしたがって、あなたが何をしているかを確認してください。 – emotionlessbananas

+0

はい、最初のオブジェクトが既に偽を返す場合は、結果のリストが空になることがあります。 – Semaphor

答えて

0

たぶん、このようなものは動作します:あなたはそれをリストとして返すようにしたい場合は

ArrayList<YourClass> newList = new ArrayList<>(
    list.stream() 
    .filter(obj -> obj.isMemberTrue()) 
    .collect(Collectors.toList()) 
); 

はjava.util.stream.Collectorsをインポートすることを忘れないでください。

+1

私はそれがtrueを返すすべてのオブジェクトではなく、それがtrueを返す最初の連続するオブジェクトを取得したいと思います。 – Semaphor

+0

@助演男コメントを確認してください:) – emotionlessbananas

+0

@Semaphorストリームで可能かどうかわかりません。 – Cicero

0

あなたはリストに

list.subList(0,list.indexOf(list.stream() 
        .filter(member->!member::isMemberTrue) 
        .findFirst() 
        .orElse(list.size())) 

を取得するには、このコードを使用するかは、私が使用することによって、新しいリストを取得していますこの中で、その後

int endIndex=list.indexOf(list.stream() 
        .filter(member->!member::isMemberTrue) 
        .findFirst() 
        .orElse(list.size()); 

list.sublist(0,endIndex); 

として使用することができますList :: sublist(..)and then I am using lambda`を実行して、条件が偽になる前にすべてのメンバーを取得します。

Flownによって審査された後、私は答えを更新しました これは役に立ちます。 :)

+2

findFirst()はインデックスではなくオブジェクトを返します。このような最初のオブジェクトが存在すれば、サブリスト(0、list.indexOf(firstObject))を実際に使用しなければなりません。 – mtj

+0

@mtjを指摘してくれてありがとう、私は編集を行います – emotionlessbananas

+1

@AsteriskNinjaこれはあなたの仕事をする必要があります: 'int low = IntStream.range(0、list.size())。filter(i - >!list.get i).isMemberTrue())。findFirst().Else(0); '。基本実装が 'RandomAccess'リストでない場合は注意してください。 – Flown

-1

ストリームで解決することができます。リストの前身を覚えておいてください。

public class ListTest 
{ 

    @Test 
    public void test() 
    { 

     List<Foo> list = new ArrayList<>(); 
     list.add(new Foo(true)); 
     list.add(new Foo(true)); 
     list.add(new Foo(true)); 
     list.add(new Foo(false)); 
     list.add(new Foo(false)); 
     list.add(new Foo(true)); 
     list.add(new Foo(true)); 


     List<Foo> firstSequence = list.stream().filter(new Predicate<Foo>() { 

      private boolean inFirstSequence = true; 

      @Override 
      public boolean test(Foo foo) 
      { 
       // turns into false, if first false value is found 
       inFirstSequence = inFirstSequence && foo.b; 

       return inFirstSequence;     
      } 
     }).collect(Collectors.toList()); 

     Assert.assertEquals(3, firstSequence.size()); 
    } 

    private class Foo 
    { 
     public Foo(boolean b) 
     { 
      super(); 
      this.b = b; 
     } 

     boolean b = true; 
    } 
} 
+1

コードを並列実行してみましたか?あなたは同じ結果を得ていますか?私はそうは思わない。予期しない動作が発生する可能性があるので、ステートレス式で状態を使用しないでください。 – Flown

+0

@Flown。ありがとう、レビューのために。 ListTestクラスにプロパティを置くと、私はあなたに同意するでしょう。したがって、状態はメソッドtest()の呼び出しスタックでのみ使用されます。あなたは[ドキュメント](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-で 'Stream'パイプラインの状態を使用してはならない理由 – Dangermouse

+0

あなたは例を見ることができますsummary.html#Statelessness) – Flown

関連する問題