2017-01-09 6 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 и итерация по каждому из них, и я бы хотел использовать потоки, если для циклов.

+3

Что Shapes? Что такое elementList? Не могли бы вы отправить действительный код для Element? Что вы хотите, чтобы ваш список результатов содержал? Я предполагаю, что вы хотите flatMap(), но ваш вопрос неясен. –

+0

@JBNizet обновлен. elementList - это список, содержащий все элементы. –

+1

Объявление вашего объявления по-прежнему недействительно Java, но то, что вы ищете, находится в ответе Банди. –

ответ

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

Вы говорите, что вы хотите, чтобы в конечном итоге со списком 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());