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 | 
