36
KOTLIN初體驗 andyang@TADSG

Kotlin 初體驗

  • Upload
    -

  • View
    169

  • Download
    0

Embed Size (px)

Citation preview

  • KOTLINandyang@TADSG

  • ABOUT ME

    Andy

    @

    @ Android Developer (TADSG)

    @ Android Code Club ()

  • KOTLIN

  • KOTLIN

  • HELLO KOTLIN

    JetBrains JVM

    Effective Java

    Java ?!

  • WHY KOTLIN

    Short Code

    Null Safety

    Smart Cast

    Lambda (Functional Programing)

    Method Extension

    Hybrid with Java

    Default final

    Everything is Object

  • HOW KOTLIN

    Install Android Studio Plugin Kotlin

    cmd + shift + a -> Configure kotlin in Project

    classpth : org.jetbrains.kotlin:lotlin-gradle-plugin:1.0.7

    apply plugin: kotlin-android

    compile org.jetbrains.kotlin:kotlin-stdlib:1.0.7

  • JAVA TO KOTLIN

    kotlin

    cmd + shift + a -> Convert Java File to Kotlin

  • KOTLIN FEATURE Multiple class in one file

    Data Class

    Properties val/var

    Null Safety

    Smart Cast

    Method Extension / infix

    Lambda

    Operator Overloading

    Companion object

    Delegate

    Dependency Injection

  • MULTIPLE CLASS IN ONE FILE

    Class

    Class

  • DATA CLASS

    hashCode()

    toString()

    equals()

    with properties

  • PROPERTIES

    var(variable)

    var age (compile error)

    var age:Int (compile error)

    var age = 1 (ok)

    age = 2 (ok)

    age = null (ok)

    var myAge = age (ok)

  • PROPERTIES

    val(value)

    val age (compile error)

    val age:Int (compile error)

    val age = 18 (ok)

    age = 19 (compile error)

  • NULL SAFETY

    NullPointerException

    ? -> nullable, default non null

    var order : Order? = Order()

    order?.price (null safety if order is null)

    order.price (compile error)

  • SMART CASE

    ClassCastException

    Stupid Case

    if(exception instanceOf HttpException) {

    HttpException httpException = (HttpException) exception

    int code = httpException.getStatusCode();

    }

  • SMART CASE Smart Case

    when(exception) {

    is HttpException -> {

    int code = exception.statusCode

    }

    default -> {

    // do something else

    }

    }

  • METHOD EXTENSION / INFIX

    Method Extension

    var name : String = null

    val isNull = name.isNullOrEmpty()

    In Java

    if(name == null || name.length == 0)

    StringUtils.isNullOrEmpty(name)

  • METHOD EXTENSION / INFIX

    How

    fun CharSequence?.isNullOrEmpty() : Boolean

    = this == null || this.lenght == 0

  • METHOD EXTENSION / INFIX Infix

    val isLike = ABC like 123-ABC

    infix fun String.like(it: String) : Boolean =

    this.toUpperCase.contains(it)

    name to Andy

    mapOf(

    Pair(nickName, andyang),

    name to Andy

    )

  • LAMBDA

    Java 8

    Retrolambda

    Kotlin lambda

  • LAMBDA

    setOnClickListener()

    view.setOnClickListener(new OnClickListener(){

    @Override

    public void onClick(View v){

    Toast.makeToast(..).show()

    }

    })

  • LAMBDA

    setOnClickListener()

    view.setOnClickListener({ view ->

    Toast.makeToast(..).show()

    })

    view.setOnClickListener({

    Toast.makeToast(..).show()

    })

  • LAMBDA

    setOnClickListener()

    view.setOnClickListener{ Toast.makeToast(..).show()}

    view.onClick{ Toast.makeToast(..).show()}

  • LAMBDA

    Adapter OnItemClickListener

    interface OnOrderItemClickListener{

    onOrderItemClick(Order order);

    }

    OnOrderItemClickListener onOrderItemClickListener;

    interface, setter, init, invoke

  • LAMBDA

    Adapter OnItemClickListener in Kotlin

    var onOrderItemClickListener : (order: Order) -> Unit

    holder?.onClick{

    onOrderItemClickListener.invoke(order)

    }

    holder?.onClick{

    onOrderItemClickListener(order)

    }

  • OPERATOR OVERLOADING

    a == b -> a.equals(b)

    a + b -> a.plus(b)

    a - b, a * b, a / b, a % b ..

    a..b -> a.rangeTo(b)

    a in b -> a.contains(b)

    a[i] -> a.get(i)

    a[i] = b -> a.set(i, b)

  • COMPANION OBJECTclass App : Application() {

    companion object {

    private var instance: Application? = null

    fun instance() = instance

    }

    override fun onCreate() {

    super.onCreate();

    instance = this

    }

    }

  • PROPERTISE DELEGATEclass Delegate : ReadWriteProperty {

    override fun getValue(thisRef: Any?, property : KPropety) {

    }

    override fun setValue(thisRef: Any?, property : KPropety, value: T) {

    }

    }

    var name : String by Delegate()

  • PROPERTISE DELEGATE Demo Delegate SharedPreferences

  • DEPENDENCY INJECTION In MPV Pattern

    Presenter need inject Model

    Repository(NetworkService networkService, LocalData localData)

    LocalData(Content context)

    Presenter(View view, Repository repository)

  • DEPENDENCY INJECTION new Presenter

    In Java

    Presenter presenter = new Presenter(new Repository(new NetworkService(), new LocalData(context))); // so ugly

    Presenter presenter = PresenterFactory.create();

  • DEPENDENCY INJECTION In kotlin

    Repository(networkService : NetworkService = NetworkService(), localData : LocalData = LocalData())

    LocalData(context : Content = App.instance())

    Presenter(view : View, repository : Repository = Repository())

  • DEPENDENCY INJECTION In kotlin

    val presenter = Presenter(view)

    for testing

    val presenter = Presenter(view, mockRepository)

  • REFERENCE

    Kotlin official guide

    https://kotlinlang.org/docs/reference/

    Kotlin For Android Developer (e-book)

    https://antonioleiva.com/kotlin-android-developers-book/

    https://kotlinlang.org/docs/reference/https://antonioleiva.com/kotlin-android-developers-book/https://antonioleiva.com/kotlin-android-developers-book/

  • andyang