Kotlin lambda con Interface como argumento

Estoy un poco desconcertado por las lambdas Koltin y quería saber cómo usarlo dado el siguiente fragment de código:

interface KotlinInterface { fun doStuff(str: String): String } 

Y la function que requiere que esta interfaz pase como parámetro:

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

Sin embargo, la misma lógica pero en Java se comstack y ejecuta según lo previsto.

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

y

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

¿Cómo puedo utilizar lambda en Kotlin en este caso?

La conversión SAM (a partir de 1.1) solo funciona con interfaces Java, no Kotlin.

También tenga en count que esta característica solo funciona para la interoperabilidad Java; como Kotlin tiene types de funciones adecuados, la conversión automática de funciones en implementaciones de las interfaces de Kotlin es innecesaria y, por lo tanto, no está soportada.

Puede encontrar forms de corregir su código en esta respuesta .

Editar: Me di count de que este es un duplicado exacto de la otra pregunta, ya que incluso el error es el mismo.

La forma correcta en Kotlin puro es usar funciones de order superior: https://kotlinlang.org/docs/reference/lambdas.html

Con la function de order superior, puede pasar la function como argumento en ella.

Si hablamos de tu ejemplo:

 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 }) } 
  • Función anónima asincrónica en Kotlin? (expresiones lambda)
  • ¿Utilizas return dentro de una lambda?
  • Comparador como lambda
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • java.lang.NoClassDefFoundError $$ inlined $ forEach $ lambda $ 1 en Kotlin
  • ¿Cómo se pone la expresión lambda después de los parameters en un map para llamar a la syntax legal?
  • ¿Por qué no puedo usar lambda para la interfaz en kotlin?
  • ¿Es posible tener extensiones de function en lambdas?
  • por qué kotlin lambda descomstackdo en código java es (Function0) null.INSTANCE
  • ¿Es posible ocultar variables del cierre de lambda?
  • ¿Cómo usar la expresión Lamba para hacer que las llamadas al método Java sean less detalladas en Kotlin?