While checking kotlin lambda decompiled code in java, found out Function1.kt interface is implemented by FunctionImpl
abstract class which is deprecated. If it is deprecated, which one i should look into for correct java implementation of Kotlin Lambda ?
Original Kotlin code
fun performDbOperation(operation: (db: DbInstance) -> Unit) {
val dbInstance = DbInstance()
dbInstance.open()
operation.invoke(dbInstance)
dbInstance.close()
}
Decompiled java code
public final void performDbOperation(@NotNull Function1 operation) {
Intrinsics.checkParameterIsNotNull(operation, "operation");
DbInstance dbInstance = new DbInstance();
dbInstance.open();
operation.invoke(dbInstance);
dbInstance.close();
}
I’m not sure what your question is? Do you want to know how to call performDbOperation
from java?
In that case you can use
performDbOperation(new Function1<DbInstance, Unit>() {
override public Unit invoke(DbInstance db){
// TODO
return Unit.INSTANCE;
}
});
I’m pretty sure you can also use javas lambda syntax (can’t remember the syntax though, it’s been a while since I used java).
Also FunctionImpl
is something internal. Not sure what it was used for. I think it was used to provide lambdas with more than 22 parameters. If you want to see a decompiled version of a lambda implementation just decompile any kotlin code that passes a lambda to a function. Make sure the function is not inline though (otherwise it won’t work). The code should look somewhat like I posted above. There is probably some extra for capturing local variables but the essence is the same. Each lambda is compiled into a class implementing FunctionX
with the lambda code in the invoke
function.
2 Likes