Разрешает ли Котлин методы расширения в лямбдах?
Я пытаюсь создать хороший SAM-подобный API для создания экземпляров абстрактных классов, потому что мне не нравятся объектные выражения. Я пытаюсь сделать что-то вроде:
{my lambda code here}.my_extension_function()
Это возможно с Kotlin?
1 ответ
Да, это возможно. Пример кода:
// extension function on lambda with generic parameter
fun <T> ((T) -> Unit).my_extension_function() {
// ...
}
// extension function on lambda without generic parameter
fun (() -> Unit).my_extension_function() {
// ...
}
И используйте это, например, так:
// lambda variable with generic parameter
val lambda: (Int) -> Unit = {
// 'it' contains Int value
//...
}
// lambda variable without generic parameter
val lambda: () -> Unit = {
//...
}
lambda.my_extension_function()
// also we can call extension function on lambda without generic parameter like this
{
//...
}.my_extension_function()
// or with generic parameter
{ i: Int ->
//...
}.my_extension_function()
Примечание: если вы вызываете функцию расширения в лямбда-выражении без создания переменной и перед ней есть вызов функции, вам нужно добавить точку с запятой после вызова функции, например:
someFunction();
{
//...
}.my_extension_function()