Chapter 9. Multi- to Single-Expression Functions

Nat and Duncan both love Kotlin’s single-expression function definitions. When should we use this form, why might we prefer it, and what Kotlin features can we use to make more functions single expressions?

As with Java, the code in a Kotlin function is usually { defined inside braces } and uses return to define the result of the function (unless it is Unit, Kotlin’s alias for void):

fun add(a: Int, b: Int): Int {
    return a + b
}

If the top level of the code is a single expression though, we can optionally drop the result type, and define the code with an expression after an equals sign:

fun addToo(a: Int, b: Int): Int = a + b

We can read this as: the result of function add equals a + b. Which makes sense for a single expression, and can also read nicely when that expression is itself composed of subexpressions:

fun max(a: Int, b: Int): Int =
    when {
        a > b -> a
        else -> b
    }

This interpretation makes less sense for functions that have side effects, especially those that perform I/O or write to mutable state. For instance:

fun printTwice(s: String): Unit = println("$s\n$s")

We can’t read this as the result of printTwice equals println(..), because println doesn’t have a result, or at least it doesn’t return one. Its function is entirely side effects, as we explored in Chapter 7.

Reserve Single-Expression Functions for Calculations

If we adopt a convention of reserving single-expression functions for calculations (“Calculations”), then ...

Get Java to Kotlin now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.