我有一个对象,它类似于以下清单所示:
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级,是有可能从最顶端的obj在5级的孩子的价值观打印所有的objid值。我想避免嵌套的for循环。
您应该使用递归。一种可能的方式与流做如下:
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
类,你可以实现与接收的一个实例helper方法相同Obj
的,即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(", "));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句