使用流从嵌套在另一个对象列表中的对象列表中筛选属性



对于以下类结构,从List<SomeClass>,对于给定的namefieldName,我想获得fieldValue s的列表。name 可能多次出现

class SomeClass {
    String name;
    List<SomeField> fields;
}
class SomeField {
    String fieldName;
    String fieldValue;
}

这就是我迄今为止在没有流的情况下所做的事情-

                for (SomeClass aClass : classes) {
                    if (aClass.getName().equalsIgnoreCase(givenName)) {
                        for (SomeField aField : aClass.getSomeField()) {
                            if (aField.getFieldName().equalsIgnoreCase(givenFieldName)) {
                                outputList.add(aField.getFieldValue());
                            }
                        }
                    }
                }

我试着把它转换成流,但我只到达这里。我不知道如何进行下一步(从这一点获得SomeField的列表并基于fieldName进行过滤(-

classes.stream()
            .filter(e -> e.getName().equalsIgnoreCase(givenName))
            .collect(Collectors.toList());

如有任何帮助,我们将不胜感激。

样本输入:

  [
   {
      "name":"a",
      "fields":[
         {
            "fieldName":"n1",
            "fieldValue":"v1"
         },
         {
            "fieldName":"n2",
            "fieldValue":"v2"
         }
      ]
   },
   {
      "name":"a",
      "fields":[
         {
            "fieldName":"n1",
            "fieldValue":"v3"
         }
      ]
   },
   {
      "name":"b",
      "fields":[
         {
            "fieldName":"n1",
            "fieldValue":"v4"
         }
      ]
   }
]

对于givenName = "a"givenFieldName = "n1":

预期输出:["v1","v3"]

使用map()flatMap()

public class Main {
    
    public static void main(String[] args) {
        
        String givenName = "a";
        String givenFieldName = "n1";
        
        List<SomeClass> classes = new ArrayList<>();
        classes.add(new SomeClass("a", List.of(new SomeField("n1", "v1"), new SomeField("n2", "v2"))));
        classes.add(new SomeClass("a", List.of(new SomeField("n1", "v3"))));
        classes.add(new SomeClass("b", List.of(new SomeField("n1", "v4"))));
        
        
        List<String> result = classes
                .stream()
                .filter(c -> c.name.equalsIgnoreCase(givenName))
                .flatMap(c -> c.fields.stream())
                .filter(f -> f.fieldName.equalsIgnoreCase(givenFieldName))
                .map(f -> f.fieldValue)
                .collect(Collectors.toList());
        
        System.out.println(result);
        
    }
    
}
class SomeClass {
    
    String name;
    List<SomeField> fields;
    
    public SomeClass(String name, List<SomeField> fields) {
        this.name = name;
        this.fields = fields;
    }
    
}
class SomeField {
    
    String fieldName;
    String fieldValue;
    
    public SomeField(String fieldName, String fieldValue) {
        this.fieldName = fieldName;
        this.fieldValue = fieldValue;
    }
    
}

使用flatMapList<SomeField>进行平坦化,然后按条件进行筛选,然后仅映射fieldValue并获得fieldValue的列表。

List<String> res = classes.stream()
            .filter(e -> e.getName().equalsIgnoreCase(givenName))
            .flatMap(m  -> m.getSomeField().stream())
            .filter(f -> f.getFieldName().equalsIgnoreCase(givenFieldName))
            .map(e -> e.getFieldValue())
            .collect(Collectors.toList());

最新更新