当前位置: 首页 > 知识库问答 >
问题:

有没有办法在Kotlin中发送一个可为空的函数作为参数?

包德业
2023-03-14

我试图在Kotlin中使用公共接口函数(正如我在Java中学习的那样)。

为此我创建了我的方法

fun foo(input: List<String>, modifier1: Function<List<String>>? = null){

}

据我记忆所及,我应该能做modifier1。应用(输入)

但这似乎是不可能的(尽管可以使用modifier1.apply{input})

阅读更多关于它的信息,我发现:

Kotlin:如何将一个函数作为参数传递给另一个?

所以我把我的方法签名改为:

fun foo(input:String,  modifier2: (List<String>) -> (List<String>){
}

在这里我可以做modifier2(输入)

我可以这样叫福

service.foo(input, ::myModifierFunction)

哪里

fun myModifierFunction(input:List<String>):List<String>{
   //do something
   return input
}

到目前为止,这似乎是可能的,但将函数引用设为null是不可接受的,有什么方法可以做到这一点吗?还是使用函数?

共有3个答案

袁翔
2023-03-14

如果要传入一个函数,该函数接受列表

fun foo(input: List<String>, modifier1: Function1<List<String>, Unit>? = null) {
    modifier1?.invoke(input)
}

Function1类型名称中的1表示它是一个单参数函数,还有Function0Function2等。

Function类型本身不是您可以用来调用该函数的东西,因为它是一个空标记接口。所有函数都实现了这一点,无论它们有多少参数。

仰欣悦
2023-03-14

您可以简单地使用使引用为空?-唯一的问题是整个函数类型需要首先在括号中:

fun foo(input: String,  modifier2: ((List<String>) -> List<String>)? = null) {
}

根据需要,modifier2是可选的;如果指定,则它可能包含null,或者它可能包含一个获取并返回字符串列表的函数。

正如另一个答案中提到的,kotlin。函数java.util.function.函数不同-尽管在实践中您不需要直接引用两者,因为-

花和宜
2023-03-14

你用的是kotlin。函数而不是java。util。作用函数在第一个示例中。请注意,后者采用2种泛型类型:1种用于传入参数,1种用于结果参数。

您看到的apply方法是默认的Kotlin方法:apply,而不是Java的函数-接口。

如果您真的希望将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 }
 类似资料:
  • 我需要调用一个方法:myMethod(双...选项卡),但我通过其他方法调用获取此数组的元素。现在我做的是: 但是有了它,myMethod是这样声明的: 我想知道如何使用bytebuddy来代替: 或 此外,属性“form”是一个动态检索方法,因此在“for”中执行的循环数永远不会相同。所以有时我可以调用这样的表单方法:或或

  • 问题内容: 我正在使用Spring 3.0.5,并为类成员尽可能多地使用@Autowire注释。我需要自动装配的bean之一需要其构造函数的参数。我浏览了Spring文档,但似乎找不到任何有关如何注释构造函数参数的参考。 在XML中,我可以将其用作bean定义的一部分。@Autowire注释是否有类似的机制? 例如: 在此示例中,如何在MyBeanService中使用@Autowire批注指定“

  • 问题内容: 假设我有一个PHP函数foo: 有什么办法只能指定第二个可选参数? 例: 问题答案: PHP本身不支持命名参数作为函数。但是,有一些方法可以解决此问题: 使用数组作为该函数的唯一参数。然后,您可以从数组中提取值。这允许在数组中使用命名参数。 如果要根据上下文允许可选数量的参数,则可以使用func_num_args和func_get_args而不是在函数定义中指定有效参数。然后,根据参数

  • 我是Kotlin的新手,很难理解下面的代码 所以这个函数叫做,它的输入参数是一个名为的函数,它是

  • 在Kotlin中,您可以创建: 然后可以使用它解析JSON,例如“{n:10}”。在这种情况下,您将有一个对象,从、或接收,它包含以下值:。 在Kotlin+GSON-How to get a emptyList when null for data类中,您可以看到另一个示例。 当您以后尝试使用时,您将在这里得到一个异常::“Kotlin.TypeCastException:null不能被强制转换

  • 问题内容: 我发现C#中的命名参数功能在某些情况下非常有用。 如果要在JavaScript中使用该怎么办? 我不想要的是: 我已经使用过这种方法。还有另一种方法吗? 我可以使用任何库来做到这一点。 问题答案: ES2015及更高版本 在ES2015中, 参数解构可用于模拟命名参数。这将要求调用者传递一个对象,但是如果您还使用默认参数,则可以避免函数内部的所有检查: ES5 有一种方法可以接近您想要