Like Groovy and Scala before it, Kotlin is a new programming language for development on the JVM. After reading that Kotlin was being developed by Jetbrains, the folks behind the incredible Java IDE IntelliJ, I decided to give it a try a few weeks ago. Here are some of my initial impressions of the language.

Kotlin claims to be very simple for Java programmers to learn, and I agree as I was able to pick up the langauge easily and quickly convert some existing Java and Groovy code to Kotlin.

One piece of code I had was originally written in JavaScript which I then converted to Groovy and then to Kotlin. In both JavaScript and Groovy this piecewise variable was dynamically typed, however with Kotlin being strongly type I obviously have to type it.

    var piecewise: ((List<Double>,
                     List<Double>,
                     (Double, Double) -> (Double) -> Double,
                     (Double, Double) -> (Double) -> Double) -> (Double) -> Double)? = null

Wow! I’m not sure readabiity has been enhanced at all but typing this (though type safety certainly has been). Kotlin 1.1 is coming soon and with it the introduction of typealias which will allow a type to be mapped to an alias, which could help in this situation.

The Good

The Bad

Method parameters are val/final

In Kotlin, method parameters are implicitly val (final in Java-speak). I know that some people consider changing the value of a method parameter to be poor practice - and I’ll admit that I do not do it often - but at times it can be very convinent. I wouldn’t mind if method parameters were val by default but could overriden to var, however Kotlin doesn’t allow this. From what I’ve read it looks like you used to be able to make make method parameters var in earlier version of Kotlin but this functionality was removed. Bummer!

Classes are sealed/final

In Kotlin, all classes are sealed (final in Java-speak). This enforces a recommendation made in Effective Java (that all classes should be final unless intended for modification). I don’t think this should be enforced at the language level. I can getting frustrated trying to extend Kotlin code written by others and being prevented from doing so because the class wasn’t opened. I know so far, I ALWAYS forget to open a class until I go to subclass it.

No traditional for loops

That’s right, they killed the traditional for loop (initialization, loop-continuation condition, increment), an only have a for-each style for loop.

For example, in Java: java int x = 0; for(int i = 0; i < array.size(); ++i) { if(i % 2 == 0) x += 0; else x -= 0; }

Can’t be directly translated to Java. It isn’t hard to replicate

The Ugly

IDE Issues

I’ve been using Apache Spark (written in Scala) in some Kotlin code recently and it has caused some IDE issues. Slow performance in the editor, deadlocking IntelliJ and in some cases causing the dreaded KotlinFrontEndException. The following code is an example code snippet I wrote which crashes the Kotlin compiler:

import org.apache.spark.sql.functions.*
import org.apache.spark.sql.types.DataTypes
import org.apache.spark.sql.SparkSession

fun main(args: Array<String>) {
	val sparkSession = SparkSession.builder()
                                   .master("local")
                                   .appName("mosaic")
                                   .`getOrCreate`()

    val func = { a: Double, b: Double ->
    	 a + b
    }

    val udf = udf(func, DataTypes.DoubleType)
    sparkSession.udf().register("foo", udf)
}

I’ve subitted a bug report to JetBrains and they’ve flagged it as a Major priority so hopefully the problem will be resolved soon. It was a bit dissappointing to hit such a show-stopping issue so early in my prototyping with Kotlin but thanks to it’s excellent Java interopability I’m able to work around it by keeping my code which causes this issue in Java for now.