Package specification should be at the top of the source file:
package my.demoimport kotlin.text.*// ...
It is not required to match directories and packages: source files can be placed arbitrarily in the file system.
An entry point of a Kotlin application is the main function.
fun main() {println("Hello world!")}
Function having two Int parameters with Int return type:
fun sum(a: Int, b: Int): Int {return a + b}
Function with an expression body and inferred return type:
fun sum(a: Int, b: Int) = a + b
Function returning no meaningful value:
fun printSum(a: Int, b: Int): Unit {println("sum of $a and $b is ${a + b}")}
Unit return type can be omitted:
fun printSum(a: Int, b: Int) {println("sum of $a and $b is ${a + b}")}
Read-only local variables are defined using the keyword val. They can be assigned a value only once.
val a: Int = 1 // immediate assignmentval b = 2 // `Int` type is inferredval c: Int // Type required when no initializer is providedc = 3 // deferred assignment
Variables that can be reassigned use the var keyword:
var x = 5 // `Int` type is inferredx += 1
Top-level variables:
val PI = 3.14var x = 0fun incrementX() {x += 1}
Just like most modern languages, Kotlin supports single-line (or end-of-line) and multi-line (block) comments.
// This is an end-of-line comment/* This is a block commenton multiple lines. */
Block comments in Kotlin can be nested.
/* The comment starts here/* contains a nested comment */and ends here. */
var a = 1// simple name in template:val s1 = "a is $a"a = 2// arbitrary expression in template:val s2 = "${s1.replace("is", "was")}, but now is $a"
fun maxOf(a: Int, b: Int): Int {if (a > b) {return a} else {return b}}
In Kotlin, if can also be used as an expression:
fun maxOf(a: Int, b: Int) = if (a > b) a else b
A reference must be explicitly marked as nullable when null value is possible.
Return null if str does not hold an integer:
fun parseInt(str: String): Int? {// ...}
Use a function returning nullable value:
fun printProduct(arg1: String, arg2: String) {val x = parseInt(arg1)val y = parseInt(arg2)// Using `x * y` yields error because they may hold nulls.if (x != null && y != null) {// x and y are automatically cast to non-nullable after null checkprintln(x * y)}else {println("'$arg1' or '$arg2' is not a number")}}
or
// ...if (x == null) {println("Wrong number format in arg1: '$arg1'")return}if (y == null) {println("Wrong number format in arg2: '$arg2'")return}// x and y are automatically cast to non-nullable after null checkprintln(x * y)
The is operator checks if an expression is an instance of a type. If an immutable local variable or property is checked for a specific type, there’s no need to cast it explicitly:
fun getStringLength(obj: Any): Int? {if (obj is String) {// `obj` is automatically cast to `String` in this branchreturn obj.length}// `obj` is still of type `Any` outside of the type-checked branchreturn null}
or
fun getStringLength(obj: Any): Int? {if (obj !is String) return null// `obj` is automatically cast to `String` in this branchreturn obj.length}
or even
fun getStringLength(obj: Any): Int? {// `obj` is automatically cast to `String` on the right-hand side of `&&`if (obj is String && obj.length > 0) {return obj.length}return null}
val items = listOf("apple", "banana", "kiwifruit")for (item in items) {println(item)}
or
val items = listOf("apple", "banana", "kiwifruit")for (index in items.indices) {println("item at $index is ${items[index]}")}
val items = listOf("apple", "banana", "kiwifruit")var index = 0while (index < items.size) {println("item at $index is ${items[index]}")index++}
fun describe(obj: Any): String =when (obj) {1 -> "One""Hello" -> "Greeting"is Long -> "Long"!is String -> "Not a string"else -> "Unknown"}
Check if a number is within a range using in operator:
val x = 10val y = 9if (x in 1..y+1) {println("fits in range")}
Check if a number is out of range:
val list = listOf("a", "b", "c")if (-1 !in 0..list.lastIndex) {println("-1 is out of range")}if (list.size !in list.indices) {println("list size is out of valid list indices range, too")}
Iterating over a range:
for (x in 1..5) {print(x)}
or over a progression:
for (x in 1..10 step 2) {print(x)}println()for (x in 9 downTo 0 step 3) {print(x)}
Iterating over a collection:
for (item in items) {println(item)}
Checking if a collection contains an object using in operator:
when {"orange" in items -> println("juicy")"apple" in items -> println("apple is fine too")}
Using lambda expressions to filter and map collections:
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")fruits.filter { it.startsWith("a") }.sortedBy { it }.map { it.toUpperCase() }.forEach { println(it) }
val rectangle = Rectangle(5.0, 2.0)val triangle = Triangle(3.0, 4.0, 5.0)
Source : Kotlin Lang
Quick Links
Legal Stuff
Social Media