Kotlin Tuples and Extension Properties
Scala-like Pair and Tuple in Kotlin
One of the things that has taken me a bit of time to get used to in Kotlin is the lack of Scala-like
syntax for accessing values in Pair
and Triple
.
In Scala, you can refer to values in tuples by their position number, rather than words.
// Scala
val pair: (Int, String) = (1, "A")
println(pair._1) // 1
println(pair._2) // "A"
val triple: (Int, String, Boolean) = (1, "A", true)
println(triple._1) // 1
println(triple._2) // "A"
println(triple._3) // true
Let’s use one of my favorite Kotlin features - extension properties , to make this look more like Scala!
// Kotlin
// Define our extension properties for first (_1) and second (_2)
val <A,B> Pair<A,B>._1: A get() = this.first
val <A,B> Pair<A,B>._2: B get() = this.second
// Define the Pair and use our new properties
val pair = 1 to "A"
println(pair._1) // 1
println(pair._2) // "A"
In the code above, we define two new extensions to Kotlin’s Pair
class, which allow us to refer to first
as _1
and
second
as _2
. Since Kotlin also has a Triple
, we should go ahead and write extensions for that too.
// Kotlin
// Define our extension properties
val <A,B,C> Triple<A,B,C>._1: A get() = this.first
val <A,B,C> Triple<A,B,C>._2: B get() = this.second
val <A,B,C> Triple<A,B,C>._3: C get() = this.third
val triple = Triple(1, "A", true)
println(triple._1) // 1
println(triple._2) // "A"
println(triple._3) // true
And there you have it, simple!