对于以下类结构,从List<SomeClass>
,对于给定的name
和fieldName
,我想获得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;
}
}
使用flatMap
对List<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());