summaryrefslogtreecommitdiffhomepage
path: root/kotlin.html.markdown
diff options
context:
space:
mode:
authorAdam <adam@adambard.com>2016-10-21 15:35:09 -0700
committerAdam <adam@adambard.com>2016-10-21 15:35:09 -0700
commit620e5d20402be961d27ce6cc6a007204c81391d4 (patch)
treee33427b1aa82c11a8e974ccd8a02b789de4c9737 /kotlin.html.markdown
parentde376b4357e79fc847e4c1ae2717946fe05d3bef (diff)
parent0659107a78bddd722df816daa01ee622fb4508d1 (diff)
Merge branch 'master' of github.com:adambard/learnxinyminutes-docs
Diffstat (limited to 'kotlin.html.markdown')
-rw-r--r--kotlin.html.markdown68
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