Tengo un objeto que tiene una apariencia similar a lo que se muestra a continuación:
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 + "]";
}
}
¿Cómo puedo imprimir la lista de objId
uso de corrientes?
EDITAR
Obj
puede contener una lista de Obj y es niños pueden contener una lista de objetos obj. Si la profundidad es de 5 niveles, es posible imprimir todos los valores de la ObjID desde la parte superior más obj a los valores del niño en el quinto nivel. Quiero evitar bucles for anidados.
Debe utilizar la recursividad. Una posible forma de hacerlo con corrientes es el siguiente:
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(", "));
}
Tenga en cuenta que esto funciona bien siempre y cuando sus Obj
casos están dispuestos en una estructura de árbol similar. Si usted tiene una determinada Obj
instancia que es a la vez un padre en algún nivel y un niño en algún nivel inferior (es decir, si sus Obj
instancias forman un gráfico), esta solución no funcionará y obtendrá una enorme StackOverflowError
.
Si no puede modificar la Obj
clase, que podría lograr lo mismo con los métodos de ayuda que reciben una instancia de Obj
decir en una ObjService
clase:
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(", "));
}