
66
|
第
3
章
}
}
在上面的代码中发生了很多事情。首先,组合使用
range() 和 map() 生成从明天开始往后
10
天的日期。然后,使用 flatMap() 与三个城市进行组合,在这里我们不想使用 zip(),
因为需要得到日期与城市所有可能的组合。对于每个组合,创建一个 Vacation 实例来封装
它。现在到了真正的逻辑,使用 zip 操作符连接三个 Observable:Observable<Weather>、
Observable<Flight> 和 Observable<Hotel>。根据指定的城市
/
日期是否有廉价的航班和
酒店,后两个 Observable 将会返回零个或一个结果。尽管 Observable<Weather> 始终都会
返回结果,但是我们使用 filter(Weather::sunny) 丢弃非晴朗的天气。最后会对这三个
流进行 zip() 操作,每个流会发布零到一个条目。如果任意一个上游的 Observable 完成,
zip() 就会立即完成并马上丢弃其他的流。由于这一特性,如果天气、航班或酒店中的任
意一个 Observable 不存在,马上就会生成 zip() 的结果,这种情况下没有条目发布。这样
形成了一个流,它由所有满足需求的行程组成。
不要惊讶于 zip 函数根本不考虑参数:(w, f, h) -> vacation。外层的 Vacation 流列出了
每天所有可行的行程。但是,我们想要确保每个行程都出现天气、廉价航班和酒店信息。
如果所有的条件都满足,就会返回一个 ...