嵌套的flatmap observable rxJava

时间:2015-04-14 20:15:18

标签: java android reactive-programming rx-java

假设我有一个博客文章api返回List<Post>我希望将其转换为其他内容使用RxJava。总的来说,我想把一个很长的字符串分成段落然后单词,对每个单词做一些事情,然后组合成段落并组合成一篇博文。每个帖子可以分成多个段落,然后可以分成多个单词。从逻辑上讲,我想要执行以下操作,但无法找到异步方式。

  • 从列表中创建Observable
  • 将每个Observable拆分为Observable<String> \n,这将为我提供段落
  • Observable<String>上的段落拆分为' ',这些段落将分为单词
  • 对每个单词进行某种转换(有些单词将作为其中一部分进行惩罚,这很好)
  • 将所有单词组合回段落,在每个单词之间放置一个空格
  • 将所有段落合并回一个帖子,在每个段落之间放回一个回车。

我无法弄清楚如何在特定术语上进行多级拆分和组合。如果我只需要拆分成页面,我可以做一些像flatmap(Observable :: from).toList()这样的东西,但这似乎不起作用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

我认为这样的事情应该可以正常工作,代码非常明显。

我对Observable#from进行了一些嵌套调用,将帖子分为段落和段落。然后我使用Observable#reduce连接单词以获取单个段落,然后再次reduce将段落连接到单个帖子。

Observable<List<String>> blogPostsWithReversedWords(List<String> blogPosts) {
    return Observable.from(blogPosts)
            .flatMap(this::blogPostToParagraphs)
            .toList();
}

Observable<String> blogPostToParagraphs(String post) {
    return Observable.from(post.split("\n"))
            .flatMap(this::paragraphToWords)
            .reduce((prevText, nextParagraph) -> prevText + "\n" + nextParagraph);
}

Observable<String> paragraphToWords(String paragraph) {
    return Observable.from(paragraph.split(" "))
            .map(this::reverseWord)
            .reduce((prevText, nextWord) -> prevText + "\n" + nextWord);
}

String reverseWord(String word) {
    return new StringBuilder(word).reverse().toString();
}