假设我有一个Observable和Player有以下字段(其中包括):
enum Height, enum Status, enum Name
我想从这个Observable中返回Single best player (它不是空的):它有height = Height.Tall, status = Status.Open, name = Name.Short
(所以如果他有一个Height.Tall - >他就是最好的一个,我不关心其他领域 - >返回此玩家。如果Observable(==没有玩家)发出的值没有Height.Tall - >让我们比较状态等并返回任何有Status.Open的玩家)。
我试着写一个比较器然后使用一个收集(这种方法看起来有点hacky因为我必须提供种子值),有没有其他方法可以做到这一点? (我在考虑过滤和合并)。
答案 0 :(得分:0)
我认为你的Observable会随着时间的推移从某个地方获取玩家(这可能就是你首先使用Observable的原因)。你想要做的是跟踪到目前为止你见过的最好的球员。这是您使用scan
或reduce
运营商所做的事情。
我们假设您Observable<Player> players
有class Player(h: Height, s: Status, n: Name)
。然后你可以做类似
players.scan((bestSeen, player) -> {
// comparison logic, maybe in a 'Comperator',
// returning the best one of 'bestSeen' and 'player'
})
如果您使用scan
,则会返回每次比较时看到的最佳玩家。但是,如果使用reduce
,则只会在比较所有玩家时发出一个元素。 (注意:这仅适用于有限的Observable
:只有在调用onCompleted
时才会发出最佳玩家!)