a new language for the JVM, which had been under development for a year. - JetBrains lead Dmitry Jemerov said that most languages did not have the features they were looking for, with the exception of Scala. However, he cited the slow compile time of Scala as an obvious deficiency. - Kotlin v1.0 was released on February 15, 2016. - At Google I/O 2017, Google announced first-class support for Kotlin on Android
client-side and web. - Is multi-paradigm: Imperative, Object oriented and functional. - Can compile to: Java (JVM), Javascript and native code; and is fully interoperable. - Easy to read, as is based on C syntax. - Well documented! - Null safety, immutability, optionals, REPL, extension functions, smart casting, lambda expressions, data classes, operator overloading, property delegation, companion objects, and a long etc.
with Java and compiles into bytecode also has full access to the Java Virtual Machine (aka JVM). - What it means? - Access to almost 10 billion of devices around the world (includes phones, servers, desktops and iot devices). - A nearly infinite collection of open source libraries. - Interoperability with other JVM languages like Scala or Clojure. - A well tested and safe execution environment. - Memory is automatically managed by default (Garbage collector).
More readable definitions: val oneMillion = 1_000_000 val creditCardNumber = 1234_5678_9012_3456L val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010 Conversion between types: toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double toChar(): Char
Strings are immutable. Elements of a string are characters that can be accessed by the indexing operation: s[i]. A string can be iterated over with a for-loop: for (c in str) { println(c) } String literals: val s = "Hello, world!\n" val text = """ for (c in "foo") print(c) """ String templates: val i = 10 val s = "i = $i" // evaluates to "i = 10" var s = "abc" val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3" // then we change the value of s s = “abcde” println(str) // str still evaluates to "abc.length is 3" val price = """ ${'$'}9.99 """
Int operator fun get(index: Int): T operator fun set(index: Int, value: T): Unit operator fun iterator(): Iterator<T> // ... } To create an array, we can use a library function arrayOf() and pass the item values to it, so that arrayOf(1, 2, 3) creates an array [1, 2, 3] // Creates an Array<String> with values ["0", "1", "4", "9", "16"] val asc = Array(5, { i -> (i * i).toString() }) Booleans: The type Boolean represents booleans, and has two values: true and false. Booleans are boxed if a nullable reference is needed. Built-in operations on booleans include • || – lazy disjunction • && – lazy conjunction • ! - negation
fun main(args: Array<String>) { val scope = "world" println("Hello, $scope!") } - fun is the way we define new functions - in kotlin we put the name after the type, like args: Array<String> - val is the keyword for immutable values, var for variable values - you can interpolate val/var inside strings using the key $ like “Hello, $scope!”
Int { return a + b } Is the same as: fun sum(a: Int, b: Int) = a + b With no meaningful return type: fun printSum(a: Int, b: Int): Unit { println("sum of $a and $b is ${a + b}") } Then you can omit Unit: fun printSum(a: Int, b: Int) { println("sum of $a and $b is ${a + b}") } More info: http://kotlinlang.org/docs/reference/functions.html
// immediate assignment val b = 2 // `Int` type is inferred val c: Int // Type required when no initializer is provided c = 3 // deferred assignment Mutable variables: var x = 5 // `Int` type is inferred x += 1 More info: http://kotlinlang.org/docs/reference/properties.html
{ if (a > b) { return a } else { return b } } Using if as an expression: fun maxOf(a: Int, b: Int) = if (a > b) a else b More info: http://kotlinlang.org/docs/reference/control-flow.html#if-expression
"kiwi") for (item in items) { println(item) } Or: val items = listOf("apple", "banana", "kiwi") for (index in items.indices) { println("item at $index is ${items[index]}") } While loop: val items = listOf("apple", "banana", "kiwi") var index = 0 while (index < items.size) { println("item at $index is ${items[index]}") index++ } More info: http://kotlinlang.org/docs/reference/control-flow.html#for-loops
range: val x = 10 val y = 9 if (x in 1..y + 1) { println("fits in range") } Iterating over a range: for (x in 1..5) { print(x) } Iterating over a progression: for (x in 1..10 step 2) { print(x) } for (x in 9 downTo 0 step 3) { print(x) } More info: http://kotlinlang.org/docs/reference/ranges.html
in items) { println(item) } Checking if a collection contains an object: when { "orange" in items -> println("juicy") "apple" in items -> println("apple is fine too") } Using lambda expressions to filter and map collections: fruits .filter { it.startsWith("a") } .sortedBy { it } .map { it.toUpperCase() } .forEach { println(it) } More info: http://kotlinlang.org/docs/reference/lambdas.html
eliminating the danger of null references from code, also known as the The Billion Dollar Mistake. In Kotlin, the type system distinguishes between references that can hold null (nullable references) and those that can not (non-null references). For example, a regular variable of type String cannot hold null: var a: String = "abc" a = null // compilation error To allow nulls, we can declare a variable as nullable string, written String?: var b: String? = "abc" b = null // ok Safe calls: b?.length // This returns b.length if b is not null, and null otherwise. The type of this expression is Int?. More info: http://kotlinlang.org/docs/reference/null-safety.html
for a predefined set of operators on our types. These operators have fixed symbolic representation (like + or *) and fixed precedence. data class Point(val x: Int, val y: Int) operator fun Point.unaryMinus() = Point(-x, -y) val point = Point(10, 20) println(-point) // prints "(-10, -20)" More info: http://kotlinlang.org/docs/reference/operator-overloading.html
properties, that, though we can implement them manually every time we need them, would be very nice to implement once and for all, and put into a library. Examples include • lazy properties: the value gets computed only upon first access, • observable properties: listeners get notified about changes to this property, • storing properties in a map, instead of a separate field for each property. To cover these (and other) cases, Kotlin supports delegated properties: class Example { var p: String by Delegate() } More info: https://kotlinlang.org/docs/reference/delegated-properties.html
the ability to extend a class with new functionality without having to inherit from the class or use any type of design pattern such as Decorator. This is done via special declarations called extensions. Kotlin supports extension functions and extension properties. To declare an extension function, we need to prefix its name with a receiver type, i.e. the type being extended. The following adds a swap function to MutableList<Int>: fun MutableList<Int>.swap(index1: Int, index2: Int) { val tmp = this[index1] // 'this' corresponds to the list this[index1] = this[index2] this[index2] = tmp } Usage: val l = mutableListOf(1, 2, 3) l.swap(0, 2) // 'this' inside 'swap()' will hold the value of 'l' More info: https://kotlinlang.org/docs/reference/extensions.html
from Kotlin is transparent): fun jsTypeOf(o: Any): String { return js("typeof o") } Calling Kotlin from JS: fun foo() = "Hello" Can be called from JavaScript like this: alert(myModule.foo()); More here: https://kotlinlang.org/docs/reference/dynamic-type.html