Kotlin: First Impressions
March 03, 2020
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 + bImmutable variables with type inference
val b = 2String 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 stringPattern 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
expressionsval 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.