¿Cómo hacer llamadas observables recursivas en RxJava?
Soy bastante nuevo enRxJava (y paradigma reactivo en general), así que tengan paciencia conmigo.
Supongamos que tengo estoNews
y esta anidadaComment
estructura de datos:
public class News {
public int id;
public int[] commentIds; //only top level comments
public News(int id, int[] commentIds) {
this.id = id;
this.commentIds = commentIds;
}
}
public class Comment {
public int id;
public int parentId; //ID of parent News or parent comment
public int[] childIds;
public Comment(int id, int parentId, int[] childIds) {
this.id = id;
this.parentId = parentId;
this.childIds = childIds;
}
}
y supongamos que tengo este punto final de API:
getComments(int commentId) //return Observable<Comment> for Comment with ID commentId
Ahora, supongamos:
getComments(1); //will return Comment(1, 99, [3,4])
getComments(2); //will return Comment(2, 99, [5,6])
getComments(3); //will return Comment(3, 1, [])
getComments(4); //will return Comment(4, 1, [])
getComments(5); //will return Comment(5, 2, [])
getComments(6); //will return Comment(6, 2, [])
** **
Ahora si tengoNews n = News(99, [1,2])
, ¿cómo hago para que todos sus hijos comenten recursivamente? es decir, para obtener comentarios con ID [1,2,3,4,5,6]?** **
He buscado y tropezado con esto:https://jkschneider.github.io/blog/2014/recursive-observables-with-rxjava.html
Esta es la función de recursión:
public class FileRecursion {
static Observable<File> listFiles(File f) {
if(f.isDirectory())
return Observable.from(f.listFiles()).flatMap(FileRecursion::listFiles);
return Observable.just(f);
}
public static void main(String[] args) {
Observable.just(new File("/Users/joschneider/Desktop"))
.flatMap(FileRecursion::listFiles)
.subscribe(f -> System.out.println(f.getAbsolutePath()));
}
}
Muestra un ejemplo sobre cómo hacer llamadas observables recursivas, pero la función interna (f.listFiles()
) es una operación de bloqueo (no devuelve otro Observable). En mi caso, la función interna (getComments
) es una función sin bloqueo que devuelve otros Observables. ¿Cómo puedo hacer eso?
Cualquier ayuda será muy apreciada.