我正在尝试在 Kotlin 中使用公共(public)接口(interface) Function (正如我在 Java 中学到的那样)。
为此,我创建了我的方法
fun foo(input: List<String>, modifier1: Function<List<String>>? = null){
}
据我记得在这里我应该能够做到
modifier1.apply(input)
但似乎不可能(虽然可以做modifier1.apply{input})
阅读更多关于它的信息,我发现了这一点:
Kotlin: how to pass a function as parameter to another?
所以我将我的方法签名更改为:
fun foo(input:String, modifier2: (List<String>) -> (List<String>){
}
在这里我可以做
modifier2(input)
我可以这样称呼 foo
service.foo(input, ::myModifierFunction)
在哪里
fun myModifierFunction(input:List<String>):List<String>{
//do something
return input
}
到目前为止,这似乎是可能的,但是将函数引用设为可为空是 Not Acceptable ,有什么办法可以做到吗?或使用功能?
最佳答案
您使用的是 kotlin.Function
而不是 java.util.function.Function
在你的第一个例子中。请注意,后者采用 2 种泛型类型:1 用于传入参数,1 用于结果参数。apply
您看到的方法是默认的 Kotlin 方法: apply
,而不是 Java 的 Function
之一-界面。
如果您真的想将 Java 函数设为可空类型,则以下内容应该可以工作:
fun foo(input: List<String>, modifier1: java.util.function.Function<List<String>, List<String>>? = null) {
modifier1?.apply(input) ?: TODO("what should be done if there wasn't passed any function?")
}
相同的 Kotlin 变体:
fun foo(input: List<String>, modifier1: ((List<String>) -> List<String>)? = null) {
modifier1?.invoke(input) ?: TODO("what should be done if there wasn't passed any function?")
}
也可能是一个默认函数,比如
{ it }
而不是 null
可能更好地满足您的需求? (Java 变体将是 Function.identity()
):// java modifier1 : Function<List<String>, List<String>> = Function.identity()
// kotlin modifier1 : (List<String>) -> List<String> = { it }
关于kotlin - 有什么方法可以在 Kotlin 中发送一个可为空的 Function<T,R> 作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59715824/