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(", "));
}
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并改进代码示例;)
添加回答
举报