Cómo imprimir una lista anidada usando una secuencia de Java en el que el objeto contiene una lista de referencias a sí mismo

Rosa14:

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 objIduso de corrientes?

EDITAR

Objpuede 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.

Federico Peralta Schaffner:

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 Objcasos están dispuestos en una estructura de árbol similar. Si usted tiene una determinada Objinstancia que es a la vez un padre en algún nivel y un niño en algún nivel inferior (es decir, si sus Objinstancias forman un gráfico), esta solución no funcionará y obtendrá una enorme StackOverflowError.


Si no puede modificar la Objclase, que podría lograr lo mismo con los métodos de ayuda que reciben una instancia de Objdecir en una ObjServiceclase:

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(", "));
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=175646&siteId=1
Recomendado
Clasificación