DEV Community

Rocky Warren
Rocky Warren

Posted on • Originally published at rocky.dev on

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
Enter fullscreen mode Exit fullscreen mode
  • Immutable variables with type inference
  val b = 2
Enter fullscreen mode Exit fullscreen mode
  • String templates
  val s2 = "${s1.replace("is", "was")}, but now is $a"
Enter fullscreen mode Exit fullscreen mode
  • Type checks and automatic casts
  if (obj is String && obj.length > 0) // obj casted to a string
Enter fullscreen mode Exit fullscreen mode
  • Pattern matching,
  when (obj) {
    1          -> "One"
    "Hello"    -> "Greeting"
    is Long    -> "Long"
    !is String -> "Not a string"
    else       -> "Unknown"
  }
Enter fullscreen mode Exit fullscreen mode
  • Ranges
  for (x in 1..5) ...
Enter fullscreen mode Exit fullscreen mode
  • Immutable collections with lambdas
  val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
  fruits
    .filter { it.startsWith("a") }
    .sortedBy { it }
    .map { it.toUpperCase() }
    .forEach { println(it) }
Enter fullscreen mode Exit fullscreen mode
  • DTOs with equals, copy, toString; can be created without new
  data class Customer(val name: String, val email: String)
Enter fullscreen mode Exit fullscreen mode
  • Default parameter values
  fun foo(a: Int = 0, b: String = "")
Enter fullscreen mode Exit fullscreen mode
  • Extension functions
  fun String.spaceToCamelCase() { ... }
  "Convert this to camelCase".spaceToCamelCase()
  Singletons,
  object Resource {
    val name = "Name"
  }
Enter fullscreen mode Exit fullscreen mode
  • Elvis operator aka "if not null" shorthand
  println(files?.size)
Enter fullscreen mode Exit fullscreen mode
  • "If not null and else" shorthand
  println(files?.size ?: "empty")
Enter fullscreen mode Exit fullscreen mode
  • Get item of possibly empty list
  emails.firstOrNull() ?: ""
Enter fullscreen mode Exit fullscreen mode
  • if expressions
  val result = if (param == 1) "one" else "other"
Enter fullscreen mode Exit fullscreen mode
  • Nullables without the .Get and .HasValue in C#
  val b: Boolean? = ...
  if (b == true) { ... } else { /* b is false or null */ }
Enter fullscreen mode Exit fullscreen mode
  • 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.

Top comments (0)

Great read:

Is it Time to go Back to the Monolith?

History repeats itself. Everything old is new again and I’ve been around long enough to see ideas discarded, rediscovered and return triumphantly to overtake the fad. In recent years SQL has made a tremendous comeback from the dead. We love relational databases all over again. I think the Monolith will have its space odyssey moment again. Microservices and serverless are trends pushed by the cloud vendors, designed to sell us more cloud computing resources.

Microservices make very little sense financially for most use cases. Yes, they can ramp down. But when they scale up, they pay the costs in dividends. The increased observability costs alone line the pockets of the “big cloud” vendors.