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

我有一个类似于下图所示的对象:


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 循环。


米琪卡哇伊
浏览 190回答 2
2回答

梵蒂冈之花

你应该使用递归。使用流执行此操作的一种可能方法如下:private Stream<Obj> allObjs() {&nbsp; &nbsp; return Stream.concat(&nbsp; &nbsp; &nbsp; &nbsp; Stream.of(this),&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; objs == null ? Stream.empty() : objs.stream().flatMap(Obj::allObjs));}@Overridepublic String toString() {&nbsp; &nbsp; return allObjs()&nbsp; &nbsp; &nbsp; &nbsp; .map(Obj::getobjId)&nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.joining(", "));}请注意,只要您的Obj实例以树状结构排列,这就会很好地工作。如果您有一个特定Obj实例,它既是某个级别的父项,又是某个较低级别的子项(即,如果您的Obj实例形成图形),则此解决方案将不起作用,您将获得一个巨大的StackOverflowError.如果您不能修改Obj类,则可以使用在类中接收Objie实例的辅助方法来实现相同的效果ObjService:public static Stream<Obj> allObjs(Obj o) {&nbsp; &nbsp; if (o == null) return Stream.empty(); // in case the argument is null&nbsp; &nbsp; return Stream.concat(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Stream.of(o),&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; o.getObjs() == null ?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Stream.empty() :&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; o.getObjs().stream().flatMap(ObjService::allObjs));}public static String deepToString(Obj o) {&nbsp; &nbsp; return ObjService.allObjs(o)&nbsp; &nbsp; &nbsp; &nbsp; .map(Obj::getobjId)&nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.joining(", "));}

慕标5832272

那么,使用Stream你可以从这里开始:objs.stream().&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; map(Obj::getObjId).&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; forEachOrdered(System.out::println);并改进一点:&nbsp; &nbsp; List<String> collect = objs.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(Objects::nonNull) // Filter only nonNull objects. Avoid NullPointerException&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(Obj::getObjId)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .peek(System.out::println) // Print the ObjId value from Obj&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList()); // Return the result to a List, if you need.现在你有了从孩子那里获取价值的基本方法。了解Stream并改进代码示例;)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java