Hov*_*nix 9 java reactive-programming observable rx-java
我对RxJava(以及一般的反应范式)都很陌生,所以请耐心等待.
假设我有这个News和这个嵌套的Comment数据结构:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
并假设我有这个API端点:
getComments(int commentId) //return Observable<Comment> for Comment with ID commentId
Run Code Online (Sandbox Code Playgroud)
现在,让我们假设:
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, [])
Run Code Online (Sandbox Code Playgroud)
**
News n = News(99, [1,2]),我怎么让它的所有孩子递归评论?即获得ID [1,2,3,4,5,6]的评论?**
我搜索并偶然发现了这个问题:https://jkschneider.github.io/blog/2014/recursive-observables-with-rxjava.html
这是递归函数:
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()));
}
}
Run Code Online (Sandbox Code Playgroud)
它显示了一个关于如何进行递归可观察调用的示例,但内部函数(f.listFiles())是一个阻塞操作(不返回另一个Observable).在我的例子中,内部函数(getComments)是一个非阻塞函数,它返回另一个Observables.我怎么做?
任何帮助都感激不尽.
这实际上与文章中描述的相同:
Observable<Comment> getInnerComments(Comment comment) {
if (comment.childIds.length > 0)
return Observable.merge(
Observable.just(comment),
Observable.from(comment.childIds)
.flatMap(id -> getComments(id))
.flatMap(this::getInnerComments));
return Observable.just(comment);
}
public static void main(String[] args) {
getComments(1)
.flatMap(this::getInnerComments)
.subscribe(c -> System.out.println(comment.toString()));
}
Run Code Online (Sandbox Code Playgroud)
我从 id = 1 的评论开始,然后将其传递给getInnerComments(). 该getInnerComments()检查如果评论有孩子。如果是,它会遍历每个孩子 id ( Observable#from) 并使用您的getComments(int)API加载每个孩子。然后每个孩子都被传递getInnerComments()给 做同样的程序。如果评论没有子评论,它会立即使用 返回Observable#just。
这是伪代码,未经测试,但您应该明白这一点。
下面是如何获取所有评论然后将它们聚合为一个的示例List<Comment>。
getNews(99)
.flatMap(news -> Observable.from(news.commentIds))
.flatMap(commentId -> getComments(commentId))
.flatMap(comment -> getInnerComments(comment))
.toList()
.subscribe(commentList -> { });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6944 次 |
| 最近记录: |