'Kotlin Lambda function as a parameter
I am new to Kotlin and have difficulty understand the code below
private fun <T> catchAsyncExceptions(f: () -> CompletableFuture<T>) =
try {
f().get()
} catch (e: ExecutionException) {
throw e.cause!!
}
So this function is called catchAsyncExceptions, its input parameter is a function called f which is () -> CompletableFuture<T>
So I would think that you use it by
catchAsyncExceptions(someFunctionThatTakesNoArgumentAndReturnsCompletableFuture)
However I see the usage is
override fun getUserInfo(userId: String) =
catchAsyncExceptions {
membersClient.getUserLocation(
GetUserLocationRequest(userId)
)
.thenApply { response ->
val (success, error) = parseSuccessAndError<GetUserLocationResponseResult.Success>(response.result!!)
error?.let {
UserInfoResponse(
error = error.code
)
)
} ?: run {
UserInfoResponse(
data = UserInfoResponseDto(
location = success?.success?.location.toString(),
)
)
}
}
}
Note that
membersClient.getUserLocation(
GetUserLocationRequest(userId)
)
returns CompletableFuture type
I am especially confused why it was a curly bracket rather than a bracket
catchAsyncExceptions {
...
}
Solution 1:[1]
In Kotlin, when you have a lambda function as a parameter, the brackets are completely optional. You can rewrite the implementation as:
catchAsyncExceptions({
membersClient.getUserLocation(
GetUserLocationRequest(userId)
)
.thenApply({ response ->
val (success, error) = parseSuccessAndError<GetUserLocationResponseResult.Success>(response.result!!)
error?.let({
UserInfoResponse(
error = error.code
)
)
}) ?: run({
UserInfoResponse(
data = UserInfoResponseDto(
location = success?.success?.location.toString(),
)
)
})
})
})
and this is a perfectly working code. For simplicity, the brackets are omitted to make the code more readable.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Nishant Jalan |
