奔跑的少女. jpg
一. 运算符重载
在 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 https://developer.android.com/topic/libraries/architecture/guide.html#recommended_app_architecture 的中的一部分.
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 许多简化的写法能够带来开发效率的提升, 代码也会显得更加整洁和优雅.
来源: http://www.jianshu.com/p/c5d5bc0427b9