Use let to name a temporary value inside a small block.

let `let` passes the current value into a block and returns the block result.

Let Basics

raw
LetBasics.kt
Replay: real traced execution (multi-file project)
fun main() {
    val raw = " kotlin "
    val cleaned = raw.trim().let { value ->
        if (value.isEmpty()) {
            "empty"
        } else {
            value.toUpperCase()
        }
    }

    println("raw=${raw.length}")
    println("cleaned=$cleaned")
}
fun main() {
    val raw = " ada "
    val cleaned = raw.trim().let { value ->
        if (value.isEmpty()) {
            "empty"
        } else {
            value.toUpperCase()
        }
    }

    println("raw=${raw.length}")
    println("cleaned=$cleaned")
}
fun main() {
    val raw = " "
    val cleaned = raw.trim().let { value ->
        if (value.isEmpty()) {
            "empty"
        } else {
            value.toUpperCase()
        }
    }

    println("raw=${raw.length}")
    println("cleaned=$cleaned")
}
  1. raw ← kotlin , cleaned ← KOTLIN

    1fun main() {2    val raw→  kotlin  = " kotlin " //@raw=" ada ", " "3    val cleaned→ KOTLIN = raw kotlin .trim().let { value ->4        if (value.isEmpty()) {5            "empty"6        } else {7            value.toUpperCase()8        }9    }1011    println("raw=${raw.length8}")12    println("cleaned=$cleanedKOTLIN")13}
    outputraw=8
    cleaned=KOTLIN
  1. raw ← ada , cleaned ← ADA

    1fun main() {2    val raw→  ada  = " ada "3    val cleaned→ ADA = raw ada .trim().let { value ->4        if (value.isEmpty()) {5            "empty"6        } else {7            value.toUpperCase()8        }9    }1011    println("raw=${raw.length5}")12    println("cleaned=$cleanedADA")13}
    outputraw=5
    cleaned=ADA
  1. raw ← , cleaned ← empty

    1fun main() {2    val raw = " "3    val cleaned→ empty = raw .trim().let { value ->4        if (value.isEmpty()) {5            "empty"6        } else {7            value.toUpperCase()8        }9    }1011    println("raw=${raw.length1}")12    println("cleaned=$cleanedempty")13}
    outputraw=1
    cleaned=empty

Follow the Value

  1. raw starts as " kotlin ".
  2. raw.length is 8.
  3. trim() removes the outside spaces and gives kotlin.
  4. let names that trimmed value as value.
  5. Because value is not empty, the block returns KOTLIN. | raw value | raw.length output | value after trim | cleaned output | | --- | ---: | --- | --- | | " ada " | 5 | ada | ADA | | " kotlin " | 8 | kotlin | KOTLIN | | " " | 1 | empty string | empty | @exercise LetBasics.kt "Reproduce raw=8 and cleaned=KOTLIN, then use raw values " ada " and " " to predict cleaned=ADA and cleaned=empty."