首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用java8流在条件比较时递归迭代列表

如何使用java8流在条件比较时递归迭代列表
EN

Stack Overflow用户
提问于 2019-05-02 18:38:56
回答 1查看 289关注 0票数 0

我有两组json,它们由递归子元素组成。我想要找到该列表中包含"code“的最后一个子代,我想从该json中找到所有"code”值。

Sample1:

代码语言:javascript
复制
{
    "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"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

Sample2:

代码语言:javascript
复制
{
    "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"
                        }
                    ]
                }
            ]
        }
    ]
}

实体如下:

代码语言:javascript
复制
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;
}

我试过了,但没有成功:

代码语言:javascript
复制
List<Children> children = response
    .getData()
    .get(0)
    .getChildren()
    .stream().filter(t -> t.getLevel().equalsIgnoreCase("assets"))
    .collect(Collectors.toList());
EN

回答 1

Stack Overflow用户

发布于 2019-05-02 21:09:22

您可以创建一个递归平铺映射子对象的方法

代码语言:javascript
复制
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();
    }
}

并将其用作

代码语言:javascript
复制
List<Children> children = response.getData().stream()
            .flatMap(d -> d.getChildren().stream())
            .flatMap(c -> toStream(c))
            .filter(t -> t.getLevel().equalsIgnoreCase("assets"))
            .collect(Collectors.toList());

例如

代码语言:javascript
复制
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'}]

另一个解决方案未使用流API

代码语言:javascript
复制
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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55950619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档