【问题标题】:Nested flatmap observable rxJava嵌套平面图可观察 rxJava
【发布时间】:2015-06-20 14:37:27
【问题描述】:

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

  • 从列表创建 Observable
  • \n 上将每个 Observable 拆分为 Observable<String>,这将给我段落
  • ' ' 上将段落拆分为Observable<String>,这将分割成单词
  • 对每个单词进行某种转换(有些单词会有标点符号,这很好)
  • 将所有单词组合回段落中,在每个单词之间留一个空格
  • 将所有段落组合回 Post 中,在每个段落之间添加回车。

我无法弄清楚如何对特定术语进行多层次的拆分和组合。如果我只需要拆分成页面,我可以执行类似 flatmap(Observable::from).toList() 之类的操作,但这似乎行不通。任何帮助将不胜感激。

【问题讨论】:

  • 既然你已经有了预先的帖子列表,那么使用流而不是 RxJava 不是很有意义吗?见sourceforge.net/projects/streamsupport
  • 我正在开发 android,目前在一个只能访问 RxJava 以获得异步支持的项目中。

标签: java android reactive-programming rx-java


【解决方案1】:

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

我对@9​​87654322@ 进行了一些嵌套调用,以将帖子拆分为段落,将段落拆分为单词。然后我使用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();
}

【讨论】:

  • 太棒了,谢谢你,我在使用 collect 但减少看起来更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多