diff options
author | Adam <adam@adambard.com> | 2016-10-21 15:35:09 -0700 |
---|---|---|
committer | Adam <adam@adambard.com> | 2016-10-21 15:35:09 -0700 |
commit | 620e5d20402be961d27ce6cc6a007204c81391d4 (patch) | |
tree | e33427b1aa82c11a8e974ccd8a02b789de4c9737 /kotlin.html.markdown | |
parent | de376b4357e79fc847e4c1ae2717946fe05d3bef (diff) | |
parent | 0659107a78bddd722df816daa01ee622fb4508d1 (diff) |
Merge branch 'master' of github.com:adambard/learnxinyminutes-docs
Diffstat (limited to 'kotlin.html.markdown')
-rw-r--r-- | kotlin.html.markdown | 68 |
1 files changed, 50 insertions, 18 deletions
diff --git a/kotlin.html.markdown b/kotlin.html.markdown index 605b1a63..d1f1aae6 100644 --- a/kotlin.html.markdown +++ b/kotlin.html.markdown @@ -9,7 +9,7 @@ Kotlin is a statically typed programming language for the JVM, Android and the browser. It is 100% interoperable with Java. [Read more here.](https://kotlinlang.org/) -```java +```kotlin // Single-line comments start with // /* Multi-line comments look like this. @@ -42,12 +42,12 @@ fun main(args: Array<String>) { Strings can be represented in a similar way as in Java. Escaping is done with a backslash. */ - val fooString = "My String Is Here!"; - val barString = "Printing on a new line?\nNo Problem!"; - val bazString = "Do you want to add a tab?\tNo Problem!"; - println(fooString); - println(barString); - println(bazString); + val fooString = "My String Is Here!" + val barString = "Printing on a new line?\nNo Problem!" + val bazString = "Do you want to add a tab?\tNo Problem!" + println(fooString) + println(barString) + println(bazString) /* A raw string is delimited by a triple quote ("""). @@ -87,7 +87,7 @@ fun helloWorld(val name : String) { Function arguments can optionally have a default value. The function return type, if required, is specified after the arguments. */ - fun hello(name: String = "world") : String { + fun hello(name: String = "world"): String { return "Hello, $name!" } println(hello("foo")) // => Hello, foo! @@ -119,16 +119,16 @@ fun helloWorld(val name : String) { println(even(7)) // => false // Functions can take functions as arguments and return functions. - fun not(f: (Int) -> Boolean) : (Int) -> Boolean { + fun not(f: (Int) -> Boolean): (Int) -> Boolean { return {n -> !f.invoke(n)} } // Named functions can be specified as arguments using the :: operator. val notOdd = not(::odd) val notEven = not(::even) - // Anonymous functions can be specified as arguments. + // Lambda expressions can be specified as arguments. val notZero = not {n -> n == 0} /* - If an anonymous function has only one parameter + If a lambda has only one parameter then its declaration can be omitted (along with the ->). The name of the single parameter will be "it". */ @@ -139,11 +139,11 @@ fun helloWorld(val name : String) { // The "class" keyword is used to declare classes. class ExampleClass(val x: Int) { - fun memberFunction(y: Int) : Int { + fun memberFunction(y: Int): Int { return x + y } - infix fun infixMemberFunction(y: Int) : Int { + infix fun infixMemberFunction(y: Int): Int { return x * y } } @@ -175,6 +175,17 @@ fun helloWorld(val name : String) { // Objects can be destructured into multiple variables. val (a, b, c) = fooCopy println("$a $b $c") // => 1 100 4 + + // destructuring in "for" loop + for ((a, b, c) in listOf(fooData)) { + println("$a $b $c") // => 1 100 4 + } + + val mapData = mapOf("a" to 1, "b" to 2) + // Map.Entry is destructurable as well + for ((key, value) in mapData) { + println("$key -> $value") + } // The "with" function is similar to the JavaScript "with" statement. data class MutableDataClassExample (var x: Int, var y: Int, var z: Int) @@ -217,16 +228,16 @@ fun helloWorld(val name : String) { Sequences represent lazily-evaluated collections. We can create a sequence using the "generateSequence" function. */ - val fooSequence = generateSequence(1, {it + 1}) + val fooSequence = generateSequence(1, { it + 1 }) val x = fooSequence.take(10).toList() println(x) // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] // An example of using a sequence to generate Fibonacci numbers: - fun fibonacciSequence() : Sequence<Long> { + fun fibonacciSequence(): Sequence<Long> { var a = 0L var b = 1L - fun next() : Long { + fun next(): Long { val result = a + b a = b b = result @@ -261,6 +272,14 @@ fun helloWorld(val name : String) { ctr++ } while (ctr < 10) + /* + "if" can be used as an expression that returns a value. + For this reason the ternary ?: operator is not needed in Kotlin. + */ + val num = 5 + val message = if (num % 2 == 0) "even" else "odd" + println("$num is $message") // => 5 is odd + // "when" can be used as an alternative to "if-else if" chains. val i = 10 when { @@ -309,6 +328,14 @@ fun helloWorld(val name : String) { println(smartCastExample(0)) // => false println(smartCastExample(true)) // => true + // Smartcast also works with when block + fun smartCastWhenExample(x: Any) = when (x) { + is Boolean -> x + is Int -> x > 0 + is String -> x.isNotEmpty() + else -> false + } + /* Extensions are a way to add new functionality to a class. This is similar to C# extension methods. @@ -329,15 +356,20 @@ enum class EnumExample { /* The "object" keyword can be used to create singleton objects. -We cannot assign it to a variable, but we can refer to it by its name. +We cannot instantiate it but we can refer to its unique instance by its name. This is similar to Scala singleton objects. */ object ObjectExample { - fun hello() : String { + fun hello(): String { return "hello" } } +fun useObject() { + ObjectExample.hello() + val someRef: Any = ObjectExample // we use objects name just as is +} + ``` ### Further Reading |