Можно ли писать скобки у функции в виде SpecialFunction()()

«Можно ли писать скобки у функции в виде SpecialFunction()()» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Kotlin/Java скобки ()() после функции недопустимы напрямую, но есть 2 исключения:

  1. Функция возвращает лямбду:
fun createPrinter(): () -> Unit = { println("Hello") }
createPrinter()() // Вызовет лямбду
  1. Function literals with receiver (DSL-стиль):
fun buildString(action: StringBuilder.() -> Unit): String {
    val sb = StringBuilder()
    sb.action()
    return sb.toString()
}
buildString { append("Hi") } // Фактически вызывает sb.append()

В Android такое встречается в:

  • Compose (Modifier.padding()() - нет, но есть похожие цепочки)
  • Kotlin DSL (Gradle, Anko)
  • Колбэки, возвращающие функции

Важно: просто fun foo()() без возврата функции/лямбды - синтаксическая ошибка.