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

Filtering data with a stream that consists of a list?

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 添加到一个大列表中,然后流式传输该列表。但这需要一个 for 循环并遍历每个循环,如果 for 循环,我想使用流来代替。

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

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

你是说你想得到一个 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());