在Kotlin的世界裏,咱們能夠重載算數運算符,包括一元運算符、二元運算符和複合賦值運算符。html
使用operator修飾符來修飾特定
函數名的函數,這些函數能夠是成員函數也能夠是擴展函數。java
例如,在RxKotlin的disposable.kt中有這樣一個方法。android
operator fun CompositeDisposable.plusAssign(disposable: Disposable) {
add(disposable)
}
複製代碼
它知足兩個條件:git
因此能夠重載複合運算符+=
, 那如何使用它呢?github
compositeDisposable += RxBus.get().register(PaySuccessEvent::class.java) { getServices() }
複製代碼
它等價於下面的代碼json
compositeDisposable.add(
RxBus.get().register(PaySuccessEvent::class.java) { getServices() }
)
複製代碼
咱們會發現,重載了運算符以後代碼會顯得更加簡潔和優雅。api
在使用Kotlin高效地開發Android App(一)中,曾經介紹過尾隨閉包,它能夠算是一種簡化的lambda表達式。閉包
對於UI控件的點擊事件,能夠查看我同事的文章View.OnClickListener在Kotlin中的進化架構
由最初的Java版本app
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setVisibility(View.VISIBLE);
...
}
});
複製代碼
使用Kotlin不斷地進行簡化,最後變成:
view.setOnClickListener {
it.visibility = View.VISIBLE
...
}
複製代碼
再舉一個RxJava的例子。
Observable.just("just a test")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
複製代碼
若是使用Java的lambda進行簡化,能夠這樣寫。
Observable.just("just a test")
.subscribe(s -> {
System.out.println(s);
}, throwable -> {
throwable.printStackTrace();
});
複製代碼
一樣的代碼,使用Kotlin來寫的話會更加簡單。
Observable.just("just a test")
.subscribe(
{ System.out.println(it) },
{ it.printStackTrace() }
)
複製代碼
Java在使用String.format函數時,須要記住%d、%s等轉換符。Kotlin大概是參考了Groovy的語法吧,使用${變量名}
便可,簡單方便。
一樣相似Groovy,Kotlin也有三個雙引號來表示多行文本的輸出。
例如:
var jsonString: String = """ { "username":"tony", "password":"123456" } """
println(jsonString)
複製代碼
執行結果:
{
"username":"tony",
"password":"123456"
}
複製代碼
LiveData和Lifecycle是Google在2017年新出的Android Architecture Components的中的一部分。
LiveData組件用於持有可觀測的數據,它掌握着組件的生命週期信息,在組件出現活躍狀態時提供更新,通常用於建立響應式UI。
Lifecycle組件用於建立可以感知自身生命週期、可以基於自身狀態調整行爲的activity和fragment。組件能夠經歷多種狀態——初始化、已建立、已啓動、已恢復、已銷燬,在狀態發生改變時會調用生命週期方法來執行各類動做。
藉助Kotlin的擴展函數和RxJava的特性,以及參考了https://github.com/YvesCheung/LiveDataToRxJava這個庫。
我作了一個LiveData的擴展庫 github地址:https://github.com/fengzhizi715/LiveDataExtension
主要功能:
支持LiveData轉換成Observable、Flowable。經過LiveData增長的擴展函數toObservable()、toFlowable()實現。
支持RxJava的Observable、Flowbale、Completable、Single、Maybe轉換成LiveData。經過它們的擴展函數toLiveData()實現。
支持RxJava的Observable、Flowbale、Completable、Single、Maybe綁定Lifecycle。經過它們的擴展函數bindLifecycle()實現。
例如在LoginViewModel中,login()函數大體多是這樣寫的,替換了以前使用的RxLifecycle。固然,使用RxLifecycle的做用也是爲了不內存泄露。因爲在咱們的App架構中已經使用了Android Architecture Components,因此能夠考慮替換RxLifecycle。
fun login(owner: LifecycleOwner): Observable<LoginResponse> {
val param = LoginParam()
param.phoneNo = phoneNumber.value.toString()
param.zoneCode = zoneCode
param.validationCode = verificationCode.value.toString()
return RetrofitManager.get()
.apiService()
.login(param)
.compose(RxJavaUtils.observableToMain())
.bindLifecycle(owner)
}
複製代碼
Kotlin許多簡化的寫法可以帶來開發效率的提高,代碼也會顯得更加整潔和優雅。
該系列的相關文章:
使用Kotlin高效地開發Android App(五)完結篇
Java與Android技術棧:每週更新推送原創技術文章,歡迎掃描下方的公衆號二維碼並關注,期待與您的共同成長和進步。