我如何使用 Observable 中的第一个也是最少的元素?

亚历克斯·科科林

假设我有一个Observable<Player>,我想将它映射到另一个Observable<Integer>,其中Integer等于player.height,但有一个条件:我想映射所有玩家,但第一个和最后一个(我们应该再检查一个他们)。所以在迭代编程中它会像这样:

heights = []
num_of_players = len(players)
for idx in len(num_of_players):
if (idx == 0 or idx == num_of_players - 1):
   if (isGoodEnough(players[idx]):
      heights.append(player.height)
else:
   heights.append(player.height)
return height

我如何以 Rx 的方式重写它(你应该假设我得到的是 Observable 而不是 List)?

阿卡诺克

鉴于:

Observable<Player> players;

Single<Integer> playerHeight(int playerId);

您必须使用publish(Function)s将序列拆分为 first、middle 和 last,然后将它们组合在一起:

players
.publish(sharedPlayers -> {
    return Observable.merge(
       // work only on the very first player
       sharedPlayers.take(1)
           .filter(firstPlayer -> isGoodEnough(firstPlayer))
           .flatMapSingle(firstPlayer -> playerHeight(firstPlayer.playerId)),
       // work with not the first and not the last
       sharedPlayers.skip(1).skipLast(1)
           .flatMapSingle(midPlayers -> playerHeight(midPlayers .playerId)),
       // work with the last which shouldn't be the first again
       sharedPlayers.skip(1).takeLast(1)
           .filter(lastPlayer -> isGoodEnough(lastPlayer))
           .flatMapSingle(lastPlayer-> playerHeight(lastPlayer.playerId))
    );
})
.subscribe(/* ... */);

请根据需要调整此解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

RxJava-如何获取列表的第一个元素并将其返回为Observable

如何将 Observable<T> 的第一个元素添加到每个组?

从android中的第一个observable接收结果后如何启动第二个observable?

如何在第一个 observable 上组合多个 observables 并在方法中作为新的 observable 返回

当每个使用相同类的后续元素也是第一个孩子时,如何使用特定类选择页面上的第一个元素?

如何使用 RxJS 跳过 observable 的第一个值?

如何在使用RxJS并行执行其他Observable之前等待第一个Observable完成

如何替换Map中的第一个元素?

如何检查数组中的第一个元素

将Observable与第二个Observable结合起来,第二个Observable使用第一个的结果

如何从另一个向量的另一个第一个元素减去向量中的第一个元素?

如何调用两个方法,第一个返回 void observable,第二个返回 observable?

当字段分隔符也是 a 时,如何用 awk 替换第一个字段中的 a ,

Rxjava zip 运算符通过使用第一个 Observable android 检查数据来过滤第二个 Observable

如何将节点元素移动到其父元素中的第一个元素

如果它也是第一个,如何撤消最后一次 git 提交?

如何使用map()删除第一个元素

我如何同步订阅一个 observable 以便我不会错过该 observable 的排放?

如何删除每个元素的第一个元素

如何使用pandas.read_csv从列表中删除第一个元素?

如何对嵌套json数组中的第一个元素使用DataContract?

如何使用jQuery选择下拉列表中的第一个元素?

如何使用jQuery选择每个组中的第一个元素?

如何使用jQuery获取元素中的第一个数字

如何使用ngFor指令获取angular 5中的第一个元素?

如何使用CSS选择所有元素中第一个出现的类

使用列表重新排列:如何引用列表中的第一个元素

如何使用foreach在Php中获取第一个元素结果?

如何从三个相同的元素中隐藏第一个和最后一个元素