[英]What's the difference between fromCallable and defer?
fromCallable
和defer
有不同的實現。 我聽到有人說defer
有助於遞歸,但我無法生成任何顯示它們之間差異的代碼。
我嘗試了無限數量的實現:
private Observable<Integer> numbers(int start) {
return Observable.just(start)
.concatWith(Observable.defer(() -> numbers(start + 1)));
}
但是訂閱時我仍然收到堆棧溢出異常
fromCallable
創建發出單個值的 observable,然后完成。
defer
推遲實際可觀察的創建,直到它被訂閱。 因此,您可以根據訂閱時的狀態創建多值observable。 例如:
Observable<Integer> daysOfWeekLeft =
Observable.defer(() ->
Observable.range(currentDayOfWeek(), 7 - currentDayOfWeek()));
基本上你可以像這樣使用fromCallable
實現相同的fromCallable
:
Observable<Integer> daysOfWeekLeft =
Observable.fromCallable(() -> currentDayOfWeek())
.flatMap(day -> Observable.range(day, 7 - day));
附注。 您的無限數字流代碼會導致無限遞歸。 可能需要使用調度程序來避免這種情況。
我正在查看Single
術語,它沒有 Observable 復雜,因為它只能有 1 個值。 (即具有 1 個發射的可觀察對象)。 以下內容也適用於其他類型(Observable、Flowable、Completable)
Single.fromCallable
Single.fromCallable
實際上從它調用的函數內部的值創建一個新的 Single 。 這就是為什么 Aaron He 說的是評論:
fromCallable 是 Observable.defer(() -> Observable.just(value)) 的一種方便的方法
它通過使用.just
來.just
創建 Observable 的額外步驟。 如果你調用一個已經創建了 Single 的fromCallable
函數,你會得到一個嵌套的 single。
// Not very useful to get a Single<Single<*>>
val fromCallable: Single<Single<String>> = Single.fromCallable {
Single.just("Example")
}
// Better in these cases, where the function inside doesn't create a Single already:
fun heavyFunction(): String { return "Heavy" }
val fromCallable2: Single<String> = Single.fromCallable {heavyFunction()}
Single.defer
Single.defer
調用其中的函數,如果它返回一個 Single,那么您可以稍后使用該 Single。 如果沒有,它將無法編譯。
val defer: Single<String> = Single.defer {
Single.just("Example")
}
// This line won't compile:
Single.defer {heavyFunction()}
// You need to wrap it in a Single:
val defer2: Single<String> = Single.defer {Single.just(heavyFunction())}
因此, Single.fromCallable從callable創建了一個 Single ,因此得名。 這個不需要創建 Single 的可調用對象,它可以是任何東西。
Defer 不會創建一個新的Single,它只是調用它的 body,它應該創建一個 Single。 這就是為什么它的函數名中沒有from
的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.