Kotlin: First Impressions

I played around with Kotlin recently and was pretty impressed. It seems like they took the best parts of C#, Scala, and Go. Here's a quick rundown of some features.

  • Expression bodied functions


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

  • Immutable variables with type inference


    val b = 2

  • String templates


    val s2 = "${s1.replace("is", "was")}, but now is $a"

  • Type checks and automatic casts


    if (obj is String && obj.length > 0) // obj casted to a string

  • Pattern matching,


    when (obj) {
    1 -> "One"
    "Hello" -> "Greeting"
    is Long -> "Long"
    !is String -> "Not a string"
    else -> "Unknown"
    }

  • Ranges


    for (x in 1..5) ...

  • Immutable collections with lambdas


    val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
    fruits
    .filter { it.startsWith("a") }
    .sortedBy { it }
    .map { it.toUpperCase() }
    .forEach { println(it) }

  • DTOs with equals, copy, toString; can be created without new


    data class Customer(val name: String, val email: String)

  • Default parameter values


    fun foo(a: Int = 0, b: String = "")

  • Extension functions


    fun String.spaceToCamelCase() { ... }
    "Convert this to camelCase".spaceToCamelCase()
    Singletons,
    object Resource {
    val name = "Name"
    }

  • Elvis operator aka "if not null" shorthand


    println(files?.size)

  • "If not null and else" shorthand


    println(files?.size ?: "empty")

  • Get item of possibly empty list


    emails.firstOrNull() ?: ""

  • if expressions


    val result = if (param == 1) "one" else "other"

  • Nullables without the .Get and .HasValue in C#


    val b: Boolean? = ...
    if (b == true) { ... } else { /* b is false or null */ }

  • The main Go influence seems to be coroutines (lightweight threads) for async code. They also reminded me of C#'s async/await, here's a good explanation.

Stay up to date

Get notified when I publish. Unsubscribe at any time.