使用 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 中的花括号和普通括号有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

栈练习之Example005-检查一个程序中的花括号方括号和圆括号是否配对

XAML 中的花括号实际上是啥意思?

用 JSX 中的 HTML 跨度节点替换字符串中的花括号

函数的 JavaScript 参数中的花括号

Scala方法调用中的花括号[重复]

PHP中的花括号表示法