【问题标题】:How to convert from Observable<List<X>> to Observable<List<Y>>, using a function that takes X as parameter & returns Observable<Y>如何使用将 X 作为参数并返回 Observable<Y> 的函数从 Observable<List<X>> 转换为 Observable<List<Y>>
【发布时间】:2018-02-24 04:25:46
【问题描述】:

我有一个方法可以无限期地(不是有限地)发出用户 ID 列表。

Observable<List<String>> getFriendUserIds()

另一种方法返回特定用户 ID 的 Account 数据。

Observable<Account> getAccount(String userId)

我需要获取 getFriendUserIds() 方法返回的所有用户 id 的 Account 数据,并在与用户 id 列表对应的列表中分组在一起。

基本上,我需要以下内容,最好以非阻塞方式。

Observable<List<String>> // infinite stream
===> *** MAGIC + getAccount(String userId) ***  
===> Observable<List<Account>> // infinite stream

例子:

["JohnId", "LisaId"]---["PaulId", "KimId", "JohnId"]------["KimId"]

===>

[<JohnAccount>, <LisaAccount>]---[<PaulAccount>, <KimAccount>, <JohnAccount>]------[<KimAccount>]

顺序并不重要,但List&lt;Account&gt; 必须包含与List&lt;String&gt; 中存在的每个用户ID 相对应的Accounts。

**请注意,此问题类似于this question,但需要将结果项重新组合到列表中。

【问题讨论】:

  • 只需将toList 应用于您在该问题的答案中发现的流程。
  • @akarnokd 但toList 会将其转换为Single,并且还要求源Observable 是有限的。 getFriendUserIds() 是一个无限源。
  • 请熟悉 RxJava 中可用的操作符——它会为您节省大量时间。在这种情况下,您需要take(1) 来限制源,并需要toObservable() 来转换回Observable
  • @akarnokd 我编辑了问题,请再看一下。

标签: java rx-java reactive-programming


【解决方案1】:

试试这个:

Observable<List<Account>> accountsList = getFriendUserIds()
.take(1)
.flatMapIterable(list -> list)
.flatMap(id -> getAccount(id))
.toList()
.toObservable();

或者这个:

Observable<List<Account>> accountsList = getFriendUserIds()
.flatMapSingle(list -> 
     Observable.fromIterable(list)
     .flatMap(id -> getAccount(id))
     .toList()
);

【讨论】:

  • 感谢您的建议,但第一个解决方案将仅采用第一个元素(示例中为 ["JohnId", "LisaId"]),返回列表中的帐户([, ])和完成。我正在寻找一个从未完成的输出流。
  • 第二种解决方案是我一直在寻找的解决方案!感谢您对 RxJava 工作的帮助和尊重!
猜你喜欢
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多