Here I read about how closures were managed in Java. As to Kotlin, I expected that a variable had to be effectively final as well (in other words val, not var) to be available in a lambda function.
But the following code snippet works.
var stringBuilder = StringBuilder()
stringBuilder.append("Old")
stringBuilder = StringBuilder()
stringBuilder.append("New")
sample_btn.setOnClickListener {
    Toast.makeText(this, stringBuilder.toString(), Toast.LENGTH_LONG).show()
    // New is shown
}
So stringBuilder doesn't need to be final to be used in the lambda funcation. I wonder what's going on under the hood, and why my code works.
 
    