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
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.