kotlin in action
TRANSCRIPT
What is Kotlin?...it’s just another language…
● Created by Jetbrains
● Statically typed
● Lightweight
● Running on JVM
Old fashion Android Coding● Android supports only Java6(ish)
● The verbosity of Java is annoying (i.e. a lot of boilerplate code)
● The Billion Dollar Mistake (aka Null Reference)
Why Kotlin?● Concise: Reduce the boilerplate code, no ceremonies, no decorations
● Safe: It’s a Null Safety language
● Versatile: Write Android, Front end and Server Side applications
● Interoperable: Write Kotlin and Java code in the same project
The Language
fun getAvg(a: Int, b: Int): Int { return (a + b) / 2}
fun getAvg(a: Int, b: Int) = (a + b) / 2
val number: Int = 0val stringArray = ArrayList<String>()var average: Float? = null
Extension FunctionsSimply way to extend a class adding new functions
fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(this, message, duration).show()}…toast("Hello Folks!")
Extension Functionsfun MutableList<Int>.swap(index1: Int, index2: Int) { val tmp = this[index1] // 'this' corresponds to the list this[index1] = this[index2] this[index2] = tmp}
fun <T> MutableList<T>.swap(index1: Int, index2: Int) { val tmp = this[index1] // 'this' corresponds to the list this[index1] = this[index2] this[index2] = tmp}
Extension Functions
fun ImageView.loadImage(url: String) {
Glide.with(context) .load(url) .diskCacheStrategy(DiskCacheStrategy.ALL) .fitCenter() .into(this)}
Lambda Expression Syntax
val sum : (Int, Int) -> Int = {x: Int, y: Int -> x + y}
val sum = { x: Int, y: Int -> x + y }
val notEmpty: (String) -> Boolean = { !it.isEmpty() }
val notEmpty = { it: String -> !it.isEmpty() }
Higher-Order Functions and LambdasA function that takes functions as parameters, or returns a function
fun getId(id: Int, func: (Int) -> String): String {
return func(id)}
val hereMyID = getId(101478, { x -> "Here My Id: $x" })
Lazy Initialization
var mySdk : Sdk? = null
mySdk = Sdk()
Sdk mySdk = null;
mySdk = new Sdk();
Java Kotlin
lateinit var mySdk : Sdk
mySdk = Sdk()
Lazy InitializationKotlin
class JavaClass { Sdk mySdk;
final Sdk getSdk() { if (mySdk == null) { mySdk = new Sdk(); } return mySdk; }}
val mySdk : Sdk by lazy { getSdk() }
protected fun getSdk() = Sdk()
Java
val mySdk : Sdk by lazy { Sdk() }
Kotlin Android Extensions LibraryJava: recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
Kotlin: recyclerView = findViewById(R.id.recycler_view) as RecyclerView
Kotter Knife: val recyclerView by bindView<RecyclerView>(R.id.recycler_view)
Extensions Library: just import import kotlinx.android.synthetic.main.my_layout.*
Android Extensions LibraryPros:
● Compile time check
● No casts
● Less error prone.
● No libraries in your build.gradle (less methods!) (Butterknife is 342)
● Can import Views from different flavors
AnkoAnko is a DSL (Domain-specific language) written in Kotlin to simplify the programmatically creation of UI.
Much more:
● Intents● Fragments● Services● Configuration qualifiers● Dialogs and toasts● Asynchronous tasks● Logging● Using SQLite● Extending Anko
val intent = Intent(this, javaClass<SomeActivity>())intent.putExtra("id", 5)intent.putExtra("name", "John")startActivity(intent)
startActivity(Intent(this, SomeActivity::class.java).putExtra("id", 5).putExtra("name", "John"))
startActivity<SomeActivity>("id" to 5, "name" to "John")
Anko - IntentsKotlin i.e. 1
Kotlin i.e. 2
Kotlin with Anko
async { // Long background task uiThread { result.text = "Done" }}
val executor = Executors.newScheduledThreadPool(4)async(executor) { // Some task}
Anko - AsyncTask
class SomeActivity : Activity(), AnkoLogger { private fun someMethod() { info("London is the capital of Great Britain") debug(5) // .toString() method will be executed warn(null) // "null" will be printed
wtf(“Oh, No!”) }}
Anko - Logger
build.gradle (Module :app)buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"}
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {………
}
API: http://thecatapi.comEndpoint: /api/images/get?format=xml&results_per_page=10
The Amazing Android App for Funny Cats
<response><data><images><image><url>http://24.media.tumblr.com/tumblr_llees8B3V31qbe5pxo1_500.jpg
</url><id>9j6</id><source_url>http://thecatapi.com/?id=9j6</source_url>
</image><image><url>http://25.media.tumblr.com/tumblr_m4g9rvBP441qz6jrko1_400.jpg
</url><id>a1k</id><source_url>http://thecatapi.com/?id=a1k</source_url>
</image></images>
</data></response>
Ciro Rizzo Enzo BelliSenior Application Developer @QVC Senior Android Developer @YoYoWallet
@JackRixhttp://www.cirorizzo.net/
@enzobelli
© 2016
https://kotlinlang.org/
https://github.com/cirorizzo/KShowshttps://github.com/cirorizzo/JShows