我经常看到人们害怕RxJava,因为它看起来是面向流的。Observable是一个流,而且可能是无限的流,所有的操作符都是用流来描述的。但是类似于List <T >,它可以有一个元素,某些Observable< T >可以根据定义总是发出一个事件。一个List<T>总是只持有一个元素是非常令人困惑的;因此,我们只是用T或Option< T >来做这个。在RxJava的土地上,有一个特殊的Observable抽象,它只发出一个元素,它被称为rx.Single<T>.
Single<T>基本上是一个用于值是T或者异常的Future的容器。在这方面,来自Java 8的CompletableFuture是Single 的近亲了(参见第193页的“CompletableFuture和Streams”)。但与CompletableFuture 不同的是,Single 是惰性的,直到有人真正订阅之后才开始产生它的值。Single通常用于以异步方式返回单个值(duh !)的API,并具有很高的失败概率。显然,对于涉及I / O的请求-响应类型(如网络调用),Single是一个很好的候选对象。与常规方法调用相比,延迟通常很高,失败是不可避免的。此外,由于Single 是惰性的和异步的,所以我们可以应用各种技巧来提高延迟和弹性,比如并发调用独立的操作并将响应组合在一起(参见第205页“使用zip、merge和concat组合响应”)。通过提供一个类型级别的指导返回一个Observable ,Single减少了API的混淆 :
Observable<Float> temperature() {
//...
}
前一种方法的声明很难预测。它只返回一个温度测量,然后就完成吗?或者它是一个可以无限地温度测量流?更糟的是,在某些情况下,它可能不发发射任何事件。如果temperature()返回Single<Float>,我们将会立即知道预期的输出。