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