2017-01-09 6 views
0

elementList목록으로 구성된 스트림으로 데이터를 필터링 하시겠습니까?

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

각각은 모든 다른 형태의 목록을 포함하는 요소들의 목록을 필터링하려고 ... 모든 요소

class Element{ 
    private ArrayList<Shape> shapeList = new ArrayList<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 루프와 각 반복 iterating 필요하고 대신에 루프를 사용하고 싶습니다.

+3

? elementList 란 무엇입니까? Element에 유효한 코드를 게시 할 수 있습니까? 결과 목록에 무엇을 포함 시키시겠습니까? 내 생각 엔 당신이 flatMap()을 원하지만, 당신의 질문이 불분명하다. –

+0

@JBNizet이 업데이트되었습니다. elementList는 모든 요소를 ​​포함하는 목록입니다. –

+1

당신의 목록 선언은 여전히 ​​유효하지 않은 자바이지만, 당신이 찾고있는 것은 반디의 대답입니다. –

답변

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