Inline functions
You can think of inline functions as instructions for the compiler to copy and paste your code. Each time the compiler sees a call to a function marked with the inline keyword, it will replace the call with the concrete function body.
It makes sense to use the inline function if it's a higher-order function that receives a lambda as one of its arguments. This is the most common use case where you would like to use inline.
Let's look at such a higher-order function and see what pseudocode the compiler will output.
First, here is the function definition:
inline fun logBeforeAfter(block: () -> String) {
    println("Before")
    println(block())
    println("After")
}
Here, we pass a lambda, or a block, to our function. This block simply returns the word "Inlining" as a String:
logBeforeAfter {
    "Inlining"
}
...