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

我正在尝试了解RxJava的详细信息。
直觉上,我期望first()take(1)相等,并做同样的事。但是,通过挖掘源代码,将first()定义为take(1).single()
这里的single()有什么用?take(1)是否已经保证输出单个项目?


最佳答案:

区别在于,take(1)将从上游中继0..1个项目,而first将中继第一个元素,或者在上游为空时发出错误(nosuchelementexception)。他们两个都没有阻止。
这是正确的first == take(1).single()其中take(1)将上游项目数限制为1,并确保上游项目不为空。
此示例仅打印“完成”

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"));

此示例失败,错误为single()
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"));

此示例打印stacktrace,因为源包含的元素太少:
Observable.empty().single()
.subscribe(System.out::println, Throwable::printStackTrace, 
    () -> System.out.println("Done"));

此示例打印stacktrace,因为源包含太多元素:
Observable.just(1, 2, 3).single()
.subscribe(System.out::println, Throwable::printStackTrace, 
    () -> System.out.println("Done"));