绑定可调用引用不使用Reactor订阅

时间:2017-06-25 17:29:47

标签: kotlin

自1.1以来,Kotlin已经绑定了可调用引用。正如我在1.1.3,我认为我应该能够使用以下方法来访问add方法:

val elements = mutableListOf<Int>()

Flux.just(1, 2, 3, 4)
    .log()
    .subscribe(elements::add)

但是,这会引发错误:

elements::add error

我不确定该错误在此特定实例中的含义。我可以毫无问题地使用.subscribe({ elements.add(it) }),但我不能使用elements::add版本吗?

2 个答案:

答案 0 :(得分:2)

Kotlin函数参考表达式与java方法参考表达式不同。返回类型Any与返回类型Unit不兼容。

错误来自MutableList#add(Int)方法的返回类型( Boolean )与参数参数类型 (Int)->Unit 不兼容subscribe方法。 所以你只能这样使用lambda表达式。

当参数类型和返回类型都与函数兼容时,您可以在某处使用list::add。例如:

val add1:(Int) -> Boolean = list::add; // MutableList.add(Int);
val add2:(Int,Int) -> Unit = list::add; // MutableList.add(Int,Int);

答案 1 :(得分:2)

重新说明并详细说明另一个答案:问题是需要Consumer,它接受​​一个元素并在其单个方法中不返回任何内容。 Kotlin中相应的函数类型为(T) -> Unit

MutableList接口中描述的add方法的类型为(T) -> Boolean:如果元素已成功添加,则返回true(这是为了支持可以&#的接口实现) 39; t包含重复项。)

对此可能的解决方案是添加一个扩展方法,该方法将元素添加到MutableList而不返回任何内容:

fun <T> MutableList<T>.addItem(element: T): Unit {
    this.add(element)
}

然后,您可以使用对此扩展名的绑定可调用引用,就像其他MutableList方法一样:

Flux.just(1, 2, 3, 4)
        .log()
        .subscribe(elements::addItem)