我正在尝试了解 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/