java - first() 和 take(1) 的区别

标签 java reactive-programming rx-java

我正在尝试了解 RxJava 的详细信息。

直觉上我希望 first()take(1) 是相等的并且做同样的事情。然而,通过挖掘源代码 first() 被定义为 take(1).single()

这里的 single() 有什么用? take(1) 不是已经保证输出单个项目了吗?

最佳答案

不同之处在于 take(1) 将从上游中继 0..1 个项目,而 first 将中继第一个元素或在以下情况下发出错误 (NoSuchElementException)上游是空的。它们都没有阻塞。

确实 first == take(1).single() 其中 take(1) 将上游项的数量限制为 1 并且 single( ) 确保上游不为空。

此示例仅打印“完成”

Observable.empty().take(1)
.subscribe(System.out::println, 
    Throwable::printStackTrace, 
    () -> System.out.println("Done"));

此示例打印“1”后跟“Done”:

Observable.just(1).take(1)
.subscribe(System.out::println, 
    Throwable::printStackTrace, 
    () -> System.out.println("Done"));

此示例还打印“1”,后跟“Done”:

Observable.just(1, 2, 3).take(1)
.subscribe(System.out::println, 
    Throwable::printStackTrace, 
    () -> System.out.println("Done"));

此示例因 NoSuchElementException

而失败
Observable.empty().first()
.subscribe(System.out::println, 
    Throwable::printStackTrace, 
    () -> System.out.println("Done"));

此示例再次打印“1”,后跟“Done”:

Observable.just(1).first()
.subscribe(System.out::println, 
    Throwable::printStackTrace, 
    () -> System.out.println("Done"));

此示例再次打印“1”,后跟“Done”:

Observable.just(1, 2, 3).first()
.subscribe(System.out::println, 
    Throwable::printStackTrace, 
    () -> System.out.println("Done"));

此示例打印 NoSuchElementException 的堆栈跟踪,因为源包含的元素太少:

Observable.empty().single()
.subscribe(System.out::println, 
    Throwable::printStackTrace, 
    () -> System.out.println("Done"));

此示例打印 IllegalArgumentException 的堆栈跟踪,因为源包含太多元素:

Observable.just(1, 2, 3).single()
.subscribe(System.out::println, 
    Throwable::printStackTrace, 
    () -> System.out.println("Done"));

关于java - first() 和 take(1) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35022473/

相关文章:

java - Jersey JAX-RS 实例注入(inject)

java - RxJava - 为什么执行器只使用一个线程

java - 构建 Android 启动器

java - VisualVM内存泄漏检测

java - 使用 DataOutputStream 上传文件不显示实际进度

android - 错误 :(9, 0) 找不到参数的方法 compile() [io.reactivex :rxandroid:1. 2.1]

reactive-programming - RxJava : Can you give me a real live scenario to use flatMap instead of map

R Shiny : fast reactive image display

android - 使用 RX 进行调用,然后根据第一次调用的结果进行多个并行调用

android - 带有 RxJava 的 MVVM,没有数据绑定(bind)