kotlin - 有什么方法可以在 Kotlin 中发送一个可为空的 Function<T,R> 作为参数?

标签 kotlin

我正在尝试在 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/

相关文章:

singleton - Kotlin 单例(使用对象修饰符声明)何时实例化?

android - 如何修复 Kotlin Realm 扩展中的 "Feature is not part of the schema for this Realm"

kotlin - IntelliJ在新的Ktor项目中缺少对slf4j的引用

android - 迭代kotlin时从列表中删除数据

android - 在设备上安装应用程序时出错

android - 解释这个基本的 Kotlin 函数

kotlin - 在 Kotlin 中使用不带前缀的枚举名称?

kotlin - 如何将制作人与 Actor 联系起来?

kotlin - 包含可空值的列表到Kotlin中的可空列表

java - Android Studio "Function invocation ' 按钮(...)预期”