2017-01-09 9 views
0

elementList全ての要素それぞれ全て異なる形状のリストが含まれた要素のリストをフィルタリングしようとリストで構成されるストリームでデータをフィルタリングしますか?

class Element{ 
    private ArrayList<Shape> shapeList = new ArrayList<Shape>(); 
} 

...

class Shape{ 
    private String color; 
    private String shape; 
} 

のリストです。

List<Shape> roundShapes = elementList.stream() 
      .filter(x -> x.getShapeList()(})  

//not sure what to have here. 
//I need to loop/stream the data that i get form getShapeList(). How to do this? 
//A stream inside a stream? 

      .collect(Collectors.toList()); 

たとえば、赤い丸い形を見つけることができます。 問題は、データが別のリスト内にあるので、私はそれを直接フィルタリングできないということです。

forループは、すべての要素をループし、各shapeListを1つの大きなリストに追加することができます。しかし、それはforループとそれぞれの反復処理を必要とし、forループの代わりにストリームを使用したいと思います。

+3

シェイプは何ですか? elementListとは何ですか? Elementの有効なコードを投稿できますか?あなたの結果リストには何を入れたいですか?私の推測ではflatMap()が必要ですが、あなたの質問は不明です。 –

+0

@JBNizetが更新されました。 elementListはすべての要素を含むリストです。 –

+1

あなたのリスト宣言はまだ無効なJavaですが、あなたが探しているのはBandiの答えです。 –

答えて

1

マップを平坦化してから、図形を反復処理する必要があります。
shape.getShape().equals("Round")を、必要な図形のフィルタ条件に置き換えます。

List<Shapes> roundShapes = elementList.stream().flatMap(element -> element.getShapeList().stream()) 
        .filter(shape -> shape.getShape().equals("Round")).collect(Collectors.toList()); 
0

あなたはたとえば、赤とラウンドのために、あなたには、いくつかの述語に基づいてElementオブジェクトから収集し、ろ過Shapeオブジェクトのリストで終わるしたいことを言っていますか?もしそうなら、あなたはフラット試みることができる - そのShapeリストにElementオブジェクトのストリームをマッピングして、フィルタリング、そのよう:

<List<Shapes> roundShapes = elementList.stream() 
          .flatMap(x -> x.getShapes().stream()) 
          .filter(x -> (x.getColor().equals("red") && x.getShape().equals("round"))) 
          .collect(Collectors.toList()); 
関連する問題