Kotlin лямбда с интерфейсом как аргумент

Я немного сбился с толку в ягодицах Koltin, и я хотел знать, как его использовать, учитывая следующий фрагмент кода:

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); } } 

Как я могу использовать лямбда в Котлине в этом случае?

Преобразование SAM ( начиная с версии 1.1) работает только с интерфейсами Java, а не с котлинскими.

Также обратите внимание, что эта функция работает только для Java interop; поскольку Kotlin имеет собственные типы функций, автоматическое преобразование функций в реализации интерфейсов Kotlin не является необходимым и поэтому не поддерживается.

В этом ответе вы можете исправить свой код.

Edit: Я понял, что это точный дубликат другого вопроса, так как даже ошибка одна и та же.

Правильный способ в чистом Kotlin – использовать функции более высокого порядка: 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 }) }