为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Java 流打印嵌套列表,其中对象包含对自身的引用列表

如何使用 Java 流打印嵌套列表,其中对象包含对自身的引用列表

米琪卡哇伊 2021-11-17 10:33:54
我有一个类似于下图所示的对象:public class Obj {  private List<Obj> objs;  private String objId;  public List<Obj> getObjs() {    return objs;  }  public String getobjId() {    return objId;  }  @Override  public String toString() {    return "Obj [objs=" + objs + ", objId=" + objId + "]";  }}如何打印objId使用流的列表?编辑Obj可以包含一个 Obj 列表,它的子级可以包含一个 obj 对象列表。如果深度为5级,是否可以将所有objId值从最顶部的obj打印到第5级的孩子的值。我想避免嵌套 for 循环。
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

你应该使用递归。使用流执行此操作的一种可能方法如下:


private Stream<Obj> allObjs() {

    return Stream.concat(

        Stream.of(this), 

        objs == null ? Stream.empty() : objs.stream().flatMap(Obj::allObjs));

}


@Override

public String toString() {

    return allObjs()

        .map(Obj::getobjId)

        .collect(Collectors.joining(", "));

}

请注意,只要您的Obj实例以树状结构排列,这就会很好地工作。如果您有一个特定Obj实例,它既是某个级别的父项,又是某个较低级别的子项(即,如果您的Obj实例形成图形),则此解决方案将不起作用,您将获得一个巨大的StackOverflowError.


如果您不能修改Obj类,则可以使用在类中接收Objie实例的辅助方法来实现相同的效果ObjService:


public static Stream<Obj> allObjs(Obj o) {

    if (o == null) return Stream.empty(); // in case the argument is null

    return Stream.concat(

            Stream.of(o), 

            o.getObjs() == null ?

                Stream.empty() :

                o.getObjs().stream().flatMap(ObjService::allObjs));

}


public static String deepToString(Obj o) {

    return ObjService.allObjs(o)

        .map(Obj::getobjId)

        .collect(Collectors.joining(", "));

}


查看完整回答
反对 回复 2021-11-17
?
慕标5832272

TA贡献1966条经验 获得超4个赞

那么,使用Stream你可以从这里开始:


objs.stream().

            map(Obj::getObjId).

            forEachOrdered(System.out::println);

并改进一点:


    List<String> collect = objs.stream()

            .filter(Objects::nonNull) // Filter only nonNull objects. Avoid NullPointerException

            .map(Obj::getObjId)

            .peek(System.out::println) // Print the ObjId value from Obj

            .collect(Collectors.toList()); // Return the result to a List, if you need.

现在你有了从孩子那里获取价值的基本方法。了解Stream并改进代码示例;)


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信