2017-11-07 1 views
4

저는 List<User> users입니다. 나는 두 조건을 기반으로 목록을 필터링하고 싶습니다. 을 FilterName람다를 사용하여 중첩 목록 필터링

공용 클래스 사용자가 엔티티를 구현 일치하는 사용자 아이디

  • 일치

    1. {

      public User() { 
          } 
      
          private String userName; 
          private String userId; 
          private List<Filter> filters; 
      
          public String getUserName() { 
           return userName; 
          } 
      
          public void setUserName(String userName) { 
           this.userName = userName; 
          } 
      
          public String getUserId() { 
           return userId; 
          } 
      
          public void setUserId(String userId) { 
           this.userId = userId; 
          } 
      
          public List<Filter> getFilters() { 
           return filters; 
          } 
      
          public void setFilters(List<Filter> filters) { 
           this.filters = filters; 
          } 
      
      } 
      
      여기

    는 메소드 서명

    List<User> users = getUsersList(); 
    public List<User> query(String userID,String filterName){ 
        users.stream().filter(element -> element.getUserID().equals(userID) && element.getFilters().stream().filter(f -> f.getFilterName().equals(filterName))).collect(Collectors.toList()); 
    
    } 
    
    입니다

    위의 방법은 엘리먼트와 스트림을 기준으로 필터링을 수행하기 때문에 작동하지 않습니다. 아무도 필터링 목록 및 중첩 목록의 올바른 방법으로 나를 도울 수 있습니까?

    나는이 방법

    users.stream().filter(e -> e.getUserId().equals(predicate.getUserID())).collect(Collectors.toList()).stream().filter(f -> f.getFilters().stream().filter(fe -> fe.getName().equals(predicate.getFilterName()))).collect(Collectors.toList()); 
    

    난 아래의 오류를

    형식 불일치를 얻고 하나 방법을 시도 :

    시도 아디 엘 Loingers 제안을 논리 값으로 스트림에서 변환 할 수 없습니다. 그것은 당신이 당신의 경우 filter에 규정 된 동일 지정된 술어의 일치 boolean 사실을 반환

    element.getFilters().stream().anyMatch(f -> f.getFilterName().equals(filterName)) 
    

    element.getFilters().stream().filter(f -> f.getFilterName().equals(filterName)) 
    

    을 변경해야

    java.util.function.Predicate<Filter> con = e -> e.getName().equals(predicate.getFilterName()); 
          result = users.stream().filter(p -> p.getUserId().equals(predicate.getUserID()) && p.getFilters().stream().anyMatch(con)).collect(Collectors.toList()); 
    
  • +3

    filterName 스트림에서'anymatch'를 사용하는 것은 어떻습니까? –

    +0

    필터 목록에있는'filterName'을 확인하고 싶다면. element.getFilters(). stream() .filter (f -> f)로 단순히'element.getFilters(). stream() .filter (f -> f.getFilterName(). .filterName.equals (FilterName)). findAny(). isPresent()' –

    답변

    1

    두 번째 조건은 모든 필터의 스트림을 가져 와서 해당 필터에있는 필터 이름이 목록임을 확인합니다. 그렇다면 true를 반환하고 그렇지 않으면 false를 반환합니다.

    관련 문제