kotlin - 惯用地传递可空类型的方法引用

标签 kotlin

我有一个界面:

interface A{
 fun test(foo:Int,bar:Int)
}

我有一个对 A 实现的可空引用

val aImpl:A? = .....

然后我有一个高阶函数,它接收一个与测试相同的可空签名函数

...

fun higherOrder(f:((a:Int,B:Int)-> Unit)?){ ... }

如何将测试函数的引用传递给 higherOrder?例如,这不起作用:

higherOrder(aImpl::test)  // aImpl is nullable
higherOrder(aImpl?::test) // I'd expect reasonably this to work, but syntax is invalid

这行得通,但感觉有点笨拙和冗长。我试图避免额外的 lambda。

higherOrder(aImpl?.let{it::test}) 

有没有更惯用的方法来做到这一点?

最佳答案

如评论中所述,有几种方法可以实现此目的

interface A{
 fun test(foo:Int,bar:Int)
}

val aImpl:A? = .....

fun higherOrder(f:((a:Int,B:Int)-> Unit)?){ ... }


// Not very Kotlin
if (aImpl != null) higherOrder(aImpl::test)

// Kotlin, but weird
higherOrder( aImpl?.let { it::test } )

// Very kotlin, maybe a bit more overhead in understanding
higherOrder { a, b -> aImpl?.test(a, b) }

关于kotlin - 惯用地传递可空类型的方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57573364/

相关文章:

android - Kotlin - 可能错误地报告未使用的代码

kotlin - 如何限制 kotlin 使用 jdk1.6 上面公布的 java api

android - onRetainCustomNonConfigurationInstance 在 AndroidX 中已弃用

android - 如何等待所有异步完成?

android - 如果我可以将 Flow 和 StateFlow 与生命周期范围\viewLifecycleOwner.lifecycleScope 一起使用,那么在 ViewModel 中使用 LiveData 有什么意义

java - 创建公共(public)库时有没有办法摆脱 "unused"和 "MemberVisibilityCanBePrivate"

android - 如何使用 Dagger2 在 Android 中注入(inject) LifecycleOwner?

android - 使用 Mockito 2 未按需要测试最终类方法

java - 使用 Bouncy CaSTLe 的 ElGamal 同态乘法

kotlin - 从 kotlin 多平台项目创建 fat jar