Skip to content
Boris Kheyfets edited this page Oct 13, 2020 · 10 revisions

Although Kotlin has excellent support for dealing with nulls (Nullables types, Smart casts), some functional styles use an Option type

// Without Option
val nullableString:String? = foo()
val aString = nullableString ?: "Default String"

// With Option
val optionString:Option<String> = foo().toOption() //toOption() is an extension function

// Using when
val aString = when(optionString){
  is Some<String> -> optionString.get()
  else -> "Default String"
}

// Using isEmpty
val aString = if(optionString.isEmpty()){
  "Default String"
} else {
  optionString.get()
}

// Using fold(ifEmpty, f), 
val aString = optionString.fold({ "Default String" }){ it }

// Using getOrElse
val aString = optionString.getOrElse{ "Default String" } 

There is also an extension function for Map<K, V> to get values as Option

@Test fun getAsOption() {
  val map = mapOf(1 to "uno", 2 to "dos")
  assertEquals(map.option[1], Some("uno"))
  assertEquals(map.option[3], None)
}

There is also a firstOption extension function for replacing firstOrNull

@Test fun firstOption() {
  val l = listOf(1, 2, 3, 4, 5, 6)
  assertEquals(l.firstOption(), Some(1))
  assertEquals(l.firstOption { it > 2 }, Some(3))
}

Clone this wiki locally