Use takeIf and takeUnless to keep or discard a value.

take-if-unless `takeIf` returns the value when a condition is true; `takeUnless` does the inverse.

Take If and Unless

stock
TakeIfUnless.kt
Replay: real traced execution (multi-file project)
fun main() {
    val stock = 3
    val available = stock.takeIf { value ->
        value > 0
    } ?: 0
    val status = stock.takeUnless { value ->
        value == 0
    }?.let { value ->
        "stock:$value"
    } ?: "empty"

    println("stock=$stock")
    println("available=$available")
    println("status=$status")
}
fun main() {
    val stock = 0
    val available = stock.takeIf { value ->
        value > 0
    } ?: 0
    val status = stock.takeUnless { value ->
        value == 0
    }?.let { value ->
        "stock:$value"
    } ?: "empty"

    println("stock=$stock")
    println("available=$available")
    println("status=$status")
}
fun main() {
    val stock = 6
    val available = stock.takeIf { value ->
        value > 0
    } ?: 0
    val status = stock.takeUnless { value ->
        value == 0
    }?.let { value ->
        "stock:$value"
    } ?: "empty"

    println("stock=$stock")
    println("available=$available")
    println("status=$status")
}
  1. stock ← 3, available ← 3, status ← stock:3

    1fun main() {2    val stock→ 3 = 3 //@stock=0, 63    val available→ 3 = stock3.takeIf { value ->4        value > 05    } ?: 06    val status→ stock:3 = stock3.takeUnless { value ->7        value == 08    }?.let { value ->9        "stock:$value"10    } ?: "empty"1112    println("stock=$stock3")13    println("available=$available3")14    println("status=$statusstock:3")15}
    outputstock=3
    available=3
    status=stock:3
  1. stock ← 0, available ← 0, status ← empty

    1fun main() {2    val stock→ 0 = 03    val available→ 0 = stock0.takeIf { value ->4        value > 05    } ?: 06    val status→ empty = stock0.takeUnless { value ->7        value == 08    }?.let { value ->9        "stock:$value"10    } ?: "empty"1112    println("stock=$stock0")13    println("available=$available0")14    println("status=$statusempty")15}
    outputstock=0
    available=0
    status=empty
  1. stock ← 6, available ← 6, status ← stock:6

    1fun main() {2    val stock→ 6 = 63    val available→ 6 = stock6.takeIf { value ->4        value > 05    } ?: 06    val status→ stock:6 = stock6.takeUnless { value ->7        value == 08    }?.let { value ->9        "stock:$value"10    } ?: "empty"1112    println("stock=$stock6")13    println("available=$available6")14    println("status=$statusstock:6")15}
    outputstock=6
    available=6
    status=stock:6