Standard Playground


fun main(args: Array<String>) {
//sampleStart
    println("Hello World")
//sampleEnd
}

class & data class print difference

//sampleStart
class User(val id: Int)
data class User2(val id: Int)

fun printUser(){
    println(User(1)) // print className@hashcode
    println(User2(2)) // print friendly
}
//sampleEnd

fun main(args: Array<String>) {
    printUser()
}

by lazy


fun main(args: Array<String>) {
    val a: Int by lazy { 1 }
    println(a)
}

Sealed class - Either

//sampleStart
sealed class Either<out L, out R> {
    data class Left<out T>(val value: T) : Either<T, Nothing>()
	data class Right<out T>(val value: T) : Either<Nothing, T>()
}

data class User(val id: Int)

fun someFunctionWillRun(){
    val e: Either<Throwable,User> = Either.Right(User(13579))
    when(e) {
        is Either.Left -> println(e.value)
        is Either.Right -> println(e.value.id)
        // becoz of sealed class, no need `else` case
    }
}


//sampleEnd

fun main(args: Array<String>) {
    someFunctionWillRun()
}

Coroutine Playground

import kotlinx.coroutines.experimental.*
import java.util.Random

fun main(args: Array<String>) = runBlocking {
//sampleStart
    launch {
        delay(Random().nextInt(100))
        println("A")
    }
    launch {
        delay(Random().nextInt(100))
        println("B")
    }
    
    println("Hello World")
//sampleEnd
    delay(200)
}
import kotlinx.coroutines.experimental.*
import java.util.Random

fun main(args: Array<String>) = runBlocking {
//sampleStart
    async {
        delay(Random().nextInt(100))
        println("A")
    }.await()
    
    // start after "A" is printed
    async {
        delay(Random().nextInt(100))
        println("B")
    }.await()
    
    // start after "A", "B" are printed
    println("Hello World")
//sampleEnd
}
import kotlinx.coroutines.experimental.*
import java.util.Random

fun main(args: Array<String>) = runBlocking {
//sampleStart
    val a = async {
        delay(100)
        println("A")
    }

    val b = async {
        delay(50)
        println("B")
    }

    // a, b are started already
    // run a new background job
    val backgroundJob = launch {
        while(true){
            println("background printing")
            delay(10)
        }
    }


    a.await()
    b.await()

    // run after a,b is finished
    backgroundJob.cancelAndJoin()
    println("Hellow World")
//sampleEnd
}