[英]How to iterate a list recursively on condition comparison using java8 stream
我有两套json,由递归的孩子组成。 我想在该列表中找到包含“代码”的最后一个孩子,我想从该jsons中找到所有“代码”值。
样本1:
{
"totalSize": 1,
"data": [
{
"level": "sites",
"children": [
{
"level": "sites",
"children": [
{
"level": "segments",
"children": [
{
"level": "assets",
"code": "1"
},
{
"level": "assets",
"code": "2"
},
{
"level": "assets",
"code": "3"
},
{
"level": "assets",
"code": "4"
},
{
"level": "assets",
"code": "5"
},
{
"level": "assets",
"code": "6"
}
]
}
]
}
]
}
]
}
样品2:
{
"totalSize": 1,
"data": [
{
"level": "sites",
"children": [
{
"level": "segments",
"children": [
{
"level": "assets",
"code": "1"
},
{
"level": "assets",
"code": "2"
},
{
"level": "assets",
"code": "3"
},
{
"level": "assets",
"code": "4"
},
{
"level": "assets",
"code": "5"
},
{
"level": "assets",
"code": "6"
}
]
}
]
}
]
}
实体如下:
public class HierarchyResponse {
private Integer totalSize;
private List<Data> data;
}
public class Data {
private List<Children> children;
private String level;
}
public class Children {
private String level;
private List<Children> children;
}
我试过但没有成功:
List<Children> children = response
.getData()
.get(0)
.getChildren()
.stream().filter(t -> t.getLevel().equalsIgnoreCase("assets"))
.collect(Collectors.toList());
您可以创建一个递归地平面映射子项的方法
private static Stream<Children> toStream(Children children) {
if (children != null) {
return Stream.concat(Stream.of(children), children.getChildren().stream().flatMap(c -> toStream(c)));
} else {
return Stream.empty();
}
}
并用它作为
List<Children> children = response.getData().stream()
.flatMap(d -> d.getChildren().stream())
.flatMap(c -> toStream(c))
.filter(t -> t.getLevel().equalsIgnoreCase("assets"))
.collect(Collectors.toList());
例如
Children b1as2 = new Children("assets", "2");
Children b1as1 = new Children("assets", "1");
Children b1seg1 = new Children("segments", "0", List.of(b1as1, b1as2));
Children b1s1 = new Children("sites", "0", List.of(b1seg1));
Children b1 = new Children("sites", "0", List.of(b1s1));
Data data = new Data(List.of(b1));
HierarchyResponse response = new HierarchyResponse(List.of(data));
将打印[Children{level='assets', code='1'}, Children{level='assets', code='2'}]
另一种解决方案是不使用Stream API
private static List<Children> findAssetsChildren(List<Children> children) {
List<Children> result = new LinkedList<>();
for(Children ch: children) {
if(ch.getLevel().equals("assets")) {
result.add(ch);
}
result.addAll(findAssetsChildren(ch.getChildren()));
}
return result;
}
//...
List<Children> children = findAssetsChildren(response.getData()
.get(0).getChildren());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.