使用包含列表的流过滤数据?

时间:2017-01-09 21:42:04

标签: java list arraylist java-stream collect

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

例如,找到一个红色和圆形的形状。 问题是我不能直接过滤它,因为数据在另一个列表中。

我可以循环所有元素并将每个shapeList添加到一个大列表中,而不是流式传输该列表。但这需要一个for循环并迭代每个循环,我想使用流而不是for循环。

2 个答案:

答案 0 :(得分:1)

您需要展平地图然后迭代形状。
shape.getShape().equals("Round")替换为您想要的形状的过滤条件。

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

答案 1 :(得分:0)

您是说要最终获得从Shape个对象收集的Element个对象列表,并根据某些谓词进行过滤,例如红色和圆形?如果是这样,您可以尝试平面 - 将Element个对象的流映射到他们的Shape列表,然后进行过滤,如下所示:

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