使用 Kotlin 的 RxJava 中的花括号和普通括号有啥区别
Posted
技术标签:
【中文标题】使用 Kotlin 的 RxJava 中的花括号和普通括号有啥区别【英文标题】:What's the difference between curly braces and normal brackets in RxJava with Kotlin使用 Kotlin 的 RxJava 中的花括号和普通括号有什么区别 【发布时间】:2018-01-25 15:56:48 【问题描述】:在使用 RxJava 时,我不明白 Kotlin 中的花括号和普通括号之间的真正区别。例如,我有以下代码按预期工作:
someMethodThatReturnsCompletable()
.andThen(anotherMethodThatReturnsACompletable())
.subscribe(...)
但以下方法不起作用:
someMethodThatReturnsCompletable()
.andThen anotherMethodThatReturnsACompletable()
.subscribe(...)
注意链的andThen()
部分与花括号的区别。我不明白两者之间有什么区别。我看过一些文章,但不幸的是我仍然难以理解这种细微的差异。
【问题讨论】:
我的问题不是关于行为 - 而是两个大括号之间的区别 - 在这种情况下它们如何/为什么不同? 【参考方案1】:第一个代码段执行anotherMethodThatReturnsACompletable()
并将返回值传递给andThen()
,其中Completable
被接受为参数。
在第二个代码段中,您将函数文字编写为lambda expression。它将() -> Unit
类型的函数传递给andThen()
,这也是一个有效的语句,但lambda 中的代码可能不会被调用。
在 Kotlin 中,有一个约定,如果函数的最后一个参数是函数,并且您将 lambda 表达式作为相应的参数传递,则可以在括号外指定它:
lock (lock) sharedResource.operation()
由于 Kotlin 支持 SAM conversion,
这意味着,只要接口方法的参数类型与 Kotlin 函数的参数类型匹配,Kotlin 函数字面量就可以自动转换为具有单个非默认方法的 Java 接口实现。
回顾Completable
,有几个重载的andThen()
函数:
andThen(CompletableSource next)
andThen(MaybeSource<T> next)
andThen(ObservableSource<T> next)
andThen(org.reactivestreams.Publisher<T> next)
andThen(SingleSource<T> next)
您可以在此处通过调用指定 SAM 类型:
andThen( CompletableSource
//implementations
)
【讨论】:
【参考方案2】:你可能知道,在 Java 中()
括号用于传递参数, 括号用于方法体,也代表 lambda 表达式的主体。
让我们比较一下:
.andThen(anotherMethodThatReturnsACompletable())
:
这里andThen()方法接受Completable
所以andThen会保存对anotherMethodThatReturnsACompletable()
方法返回的可完成对象的引用以供以后订阅。
.andThen anotherMethodThatReturnsACompletable()
:这会将 lambda 表达式传递给 andThen 方法。这里 anotherMethodThatReturnsACompletable()
在传递 lambda 时不会被调用。 anotherMethodThatReturnsACompletable()
会在andThen方法中调用lambda函数时被调用。
希望对你有帮助。
【讨论】:
【参考方案3】:()
-> 你在其中传递了一些东西,即函数参数
-> 你正在它们里面执行一些东西。即表达式
【讨论】:
【参考方案4】:.andThen(anotherMethodThatReturnsACompletable())
表示anotherMethodThatReturnsACompletable()
的结果将传递给andThen()
.andThen anotherMethodThatReturnsACompletable()
表示执行anotherMethodThatReturnsACompletable()
的lambda 将被传递给andThen()
【讨论】:
以上是关于使用 Kotlin 的 RxJava 中的花括号和普通括号有啥区别的主要内容,如果未能解决你的问题,请参考以下文章