一. 运算符重载
在Kotlin的世界里,我们可以重载算数运算符,包括一元运算符、二元运算符和复合赋值运算符。
使用operator修饰符来修饰特定
函数名的函数,这些函数可以是成员函数也可以是扩展函数。
例如,在RxKotlin的disposable.kt中有这样一个方法。
operator fun CompositeDisposable.plusAssign(disposable: Disposable) { add(disposable) }
它满足两个条件:
- 使用operator进行修饰
- 使用了plusAssign作为函数名
所以可以重载复合运算符+=
, 那如何使用它呢?
compositeDisposable += RxBus.get().register(PaySuccessEvent::class.java) { getServices() }
它等价于下面的代码
compositeDisposable.add( RxBus.get().register(PaySuccessEvent::class.java) { getServices() } )
我们会发现,重载了运算符之后代码会显得更加简洁和优雅。
二. 简化的lambda表达式
在使用Kotlin高效地开发Android App(一)中,曾经介绍过尾随闭包,它可以算是一种简化的lambda表达式。
对于UI控件的点击事件,可以查看我同事的文章View.OnClickListener在Kotlin中的进化
由最初的Java版本
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() } )
三. String的处理
Java在使用String.format函数时,需要记住%d、%s等转换符。Kotlin大概是参考了Groovy的语法吧,使用${变量名}
即可,简单方便。
同样类似Groovy,Kotlin也有三个双引号来表示多行文本的输出。
例如:
var jsonString: String = """ { "username":"tony", "password":"123456" } """ println(jsonString)
执行结果:
{ "username":"tony", "password":"123456" }
四. RxJava 和 LiveData、Lifecycle
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许多简化的写法能够带来开发效率的提升,代码也会显得更加整洁和优雅。