Higher order functions and lambdas
Higher-Order Functions and Lambdas Deep Dive¶
Overview¶
Higher-order functions are central to idiomatic Kotlin API design. They power collection transformations, builders, coroutines, Flow, and DSLs.
Core Concepts¶
A higher-order function either:
- accepts a function
- returns a function
fun repeat(times: Int, block: () -> Unit) {
kotlin.repeat(times) { block() }
}
Lambda with receiver example:
fun buildMessage(block: StringBuilder.() -> Unit): String {
return StringBuilder().apply(block).toString()
}
Internal Implementation¶
Lambdas can compile into:
- generated classes/objects
- inlined code when used with inline functions
Lambdas with receiver are still function types, but with an implicit receiver available inside the body.
JVM / Compiler Behavior¶
Without inlining, lambdas may allocate objects. With inline functions, the compiler can reduce or remove that overhead.
This is why Kotlin's higher-order style is expressive but still tied to JVM allocation and bytecode tradeoffs.
Code Examples¶
val doubled = listOf(1, 2, 3).map { it * 2 }
val text = buildMessage {
append("Hello ")
append("Kotlin")
}
Common Interview Questions¶
- Q: Why are higher-order functions important in Kotlin? A: Connect Kotlin features to outcomes: safer APIs through nullability, clearer state modeling, and awareness of generated bytecode and allocation cost.
- Q: What is a lambda with receiver? A: Tie Kotlin language features to production outcomes: safety, readability, testability, and runtime or allocation tradeoffs when relevant.
- Q: How do inline functions affect lambda cost? A: Connect Kotlin features to outcomes: safer APIs through nullability, clearer state modeling, and awareness of generated bytecode and allocation cost.
Production Considerations¶
Use higher-order APIs to improve abstraction and reuse, but avoid creating APIs so abstract that they become hard to debug.
Performance Insights¶
Main cost areas:
- lambda allocation
- capturing outer variables
- deep operator chains
These matter most in hot paths.
Senior-Level Insights¶
The best Kotlin APIs often feel declarative because of higher-order functions, but strong engineers balance API elegance with debuggability and runtime cost.