要将普通的Observable 转换为 BlockingObservable,可以使用 Observable.toBlocking( )) 方法或者) 方法。

    • first( ) — 阻塞直到Observable发射了一个数据,然后返回第一项数据
    • — 阻塞直到Observable发射了一个数据或者终止,返回第一项数据,或者返回默认值
    • last( ) — 阻塞直到Observable终止,然后返回最后一项数据
    • — 阻塞直到Observable终止,然后返回最后一项的数据,或者返回默认值
    • mostRecent( ) — 返回一个总是返回Observable最近发射的数据的iterable
    • — 返回一个Iterable,会阻塞直到Observable发射了另一个值,然后返回那个值
    • latest( ) — 返回一个iterable,会阻塞直到或者除非Observable发射了一个iterable没有返回的值,然后返回这个值
    • — 如果Observable终止时只发射了一个值,返回那个值,否则抛出异常
    • singleOrDefault( ) — 如果Observable终止时只发射了一个值,返回那个值,否则否好默认值
    • — 将Observable转换为一个Future
    • toIterable( ) — 将一个发射数据序列的Observable转换为一个Iterable
    • — 将一个发射数据序列的Observable转换为一个Iterator

    BlockingObservable的方法不是将一个Observable变换为另一个,也不是过滤Observables,它们会打断Observable的调用链,会阻塞等待直到Observable发射了想要的数据,然后返回这个数据(而不是一个Observable)。

    要将一个Observable转换为一个BlockingObservable,你可以使用Observable.toBlockingBlockingObservable.from方法。

    first

    要获取BlockingObservable的发射物,使用无参数的first方法。

    • Javadoc: )

    first.p

    • Javadoc: )

    firstOrDefault

    firstOrDefault

    和过滤操作符一样,如果原始Observable没有数据,first会抛出异常,firstOrDefault会返回一个默认值。

    • Javadoc: )

    firstOrDefault同样也接受一个谓词函数作为参数,用于获取满足条件的第一项,如果没有满足条件的就返回默认值。

    single

    single

    singlefirst类似,但是如果不是正好发射一个数据,会抛出异常NoSuchElementException。其它几个变体的功能也是类似的。

    single.p

    同上,接受一个谓词函数,如果满足条件的不是正好一个,会抛出异常。

    类似firstOrDefault,在为空时返回默认值,超过一个就抛出异常。

    • Javadoc: )

    singleOrDefault.p

    single

    类似firstOrDefault,接受一个谓词函数,如果没有复合条件的,返回默认值;如果有多个复合条件的,以错误通知终止。

    • Javadoc: )

    next

    next操作符会阻塞直到BlockingObservable返回另外一个值,然后它返回那个值。你可以重复调用这个方法从BlockingObservable获取后续的数据项。以阻塞的方式高效的迭代获取它的发射物。

    latest操作符也是类似的,但是它不会阻塞等待下一个值,它立即返回最近发射的数据项,只在Observable还没有发射任何数据时会阻塞。

    mostRecent

    mostRecent操作符让你可以用类似的方式迭代一个BlockingObservable,但是它总是立即返回一个值,或者是默认值(如果BlockingObservable还没有发射任何数据),或者是BlockingObservable最近发射的数据项。

    • Javadoc: )

    forEach

    BlockingObservable.forEach接受单个函数作为参数,这个函数的作用类似于普通Observable订阅中的onNext函数。forEach自身会阻塞知道BlockingObservable完成,当它不阻塞时就是完成了,不是通过调用一个回调方法表示它完成了。如果遇到了错误它将抛出一个RuntimeException(而不是调用一个类似于onError的回调方法)。

    • Javadoc: )

    参见:

    附录:相似的阻塞和非阻塞操作符列表