Kotlin 初體驗
-
Upload
- -
Category
Engineering
-
view
170 -
download
0
Transcript of Kotlin 初體驗
-
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