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

科特林 lambda 与接口作为参数

狄信然
2023-03-14

我对Koltin lambdas有点困惑,我想知道如何使用它,给出以下代码片段:

interface KotlinInterface {

    fun doStuff(str: String): String
}

以及需要将该接口作为参数传递的函数:

fun kotlinInterfaceAsArgument(kotlinInterface: KotlinInterface): String{

   return kotlinInterface.doStuff("This was passed to Kotlin Interface method")
}

fun main(args: Array<String>){

    val newString = kotlinInterfaceAsArgument({
      str -> str + " | It's here" //error here (type mismatch)
    })
}

但是,相同的逻辑,但在Java中,按预期编译和运行。

public class JavaClass {

   public String javaInterfaceAsArgument(JavaInterface javaInterface){

        String passedToInterfaceMethod = "This was passed to Java Interface method";
        return javaInterface.doStuff(passedToInterfaceMethod);
    }

   public interface JavaInterface {

        public String doStuff(String str);
    }
}

public class Main {

    public static void main(String[] args) {

        JavaClass javaClass = new JavaClass();
        String newValue = javaClass.javaInterfaceAsArgument(str -> str + " | It's here!");

        System.out.println(newValue);
    }
}

在这种情况下,如何在静态编程语言中使用lambda?

共有2个答案

贺卜霸
2023-03-14

纯静态编程语言的正确方法是使用高阶函数:https://kotlinlang.org/docs/reference/lambdas.html

使用高阶函数,您可以将函数作为参数传递。

如果我们谈谈你的例子:

fun kotlinFunctionAsArgument(kotlinFunction: (String) -> String): String {
    return kotlinFunction("This was passed to Kotlin Function method")
}

fun main(args: Array<String>){
    val newString = kotlinFunctionAsArgument({
        str -> str + " | It's here" //there are no errors
    })
}
桂高义
2023-03-14

SAM转换(从1.1开始)只适用于Java接口,不适用于Kotlin接口。

还要注意,此功能仅适用于Java互操作;由于Kotlin具有正确的函数类型,因此不需要将函数自动转换为Kotlin接口的实现,因此不受支持。

您可以在此答案中看到一些修复代码的方法。

编辑:我意识到这是另一个问题的完全重复,因为即使错误也是一样的。

 类似资料:
  • 如何在使用Kotlin的Spring Boot中正确初始化ConfigurationProperties? 目前我喜欢下面的例子: 但是它看起来很丑陋,实际上不是一个iable,foo是常量ue,应该在启动期间初始化,将来不会改变。

  • 问题内容: 我正在学习具有C ++和Java背景的Kotlin。我期待下面的打印,不。我知道这对应到。默认实现不比较每个成员,即和吗?如果是这样,它会不会看到字符串值相等(因为再次映射到字符串值)?显然,我在Kotlin中还没有涉及平等与身份相关的问题。 问题答案: 您描述的默认实现仅适用于数据类。不适用于从中继承实现的常规类,只需使对象与自身相等即可。

  • 这是正确的吗? 我可以找到一个相关的问题,但它是有参数的,我不能在没有params的情况下转换它。

  • 我正在尝试IntDef typedef将特定类型的参数限制为函数。但是当我使用Java使用IntDef时,它工作正常,但同时,它不适用于kotlin。以下是我的代码片段 - 在JAVA中- 在静态编程语言中- 在课堂上使用- 调用演示函数给我一个错误消息,说它必须是:< code>TransTypeJava之一。CASH,< code>TransTypeJava。通过传递< code>TransT

  • 我有静态编程语言界面 我如何从爪哇调用它?什么