Reputation: 466
How can I check if lambda is empty in Kotlin? For example, I have signature like
onError:(Throwable) -> Unit = {}
How can I differ is its default value comes to body or value applied to this function?
Upvotes: 10
Views: 4596
Reputation: 790
I don't believe there is a way to check if a lambda contains executable code or not (at least not to my knowledge), but you could do something like the following:
fun foo(onError: ((Throwable) -> Unit)? = null) {
if (onError != null) {
// do something
} else {
// do something else
}
}
Upvotes: 0
Reputation: 2350
Just don't use empty lambdas as defaults.
Since in kotlin nullability is a first class citizen and the clear indication of a missing value, I would pass null as the default argument.
onError: ((Throwable) -> Unit)? = null
The signature looks a bit ugly, but I think it's worth it.
For example it can be easily checked and handled and you don't expect that the lambda does something useful - especially for lambdas with a return value.
I gave the same comment here: https://stackoverflow.com/a/38793639/3917943
Upvotes: 6
Reputation: 12167
You couldn't test if the body of an lambda is empty (so it contains no source-code) but you can check if the lambda is your default value by creating a constant for that value and use this as default value. Than you can also check if the value is the default value:
fun main(args: Array<String>) {
foo()
foo { }
foo { println("Bar") }
}
private val EMPTY: (Throwable) -> Unit = {}
fun foo(onError: (Throwable) -> Unit = EMPTY) {
if (onError === EMPTY) {
// the default value is used
} else {
// a lambda was defined - no default value used
}
}
Upvotes: 18