前面几篇对Kotlin做了基础性的讲解,后续会带来开发Android的分享。
一、扩展函数
扩展函数概念:Kotlin允许开发者在不改变已有类的情况下,为某个类添加新的函数。(普通的Java要做到这一点基本就得重写方法,或者用Dagger2)。举个栗子
/**
* java关闭io流
*/
public static void closeIO(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
用Kotlin可以用扩展函数来写
fun Closeable?.closeIO() {
try {
this?.close()
} catch (e: Throwable) {
}
}
实现了该接口的类都可以使用该方法
实际开发中,使用Gilde就可以很好的运用扩展函数
fun ImageView.get(url: String): GlideRequest<Drawable> = GlideApp.with(context).load(url)
/**
* 占位符矩形
*/
fun ImageView.load(url: String) {
get(url).placeholder(R.drawable.default)
.error(R.drawable.default)
.into(this)
}
fun ImageView.loadCircle(url: String) {
get(url).placeholder(R.drawable.default)
.error(R.drawable.default)
.into(this)
}
二、巧用with
with是将某个对象作为函数的参数,在函数块内可以通过 this 指代该对象。
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return receiver.block()
}
普通方式
holder.itemView.tv_game_name.text = content.name
holder.itemView.tv_bound_user_name.text = content.bound_user_name
用完之后
with(content) {
holder.itemView.tv_game_name.text = name
holder.itemView.tv_bound_user_name.text = bound_user_name
}
三、尾随闭包
直接举个栗子
public <T> Disposable register(Class<T> eventType, Consumer<T> onNext) {
return toObservable(eventType).observeOn(AndroidSchedulers.mainThread()).subscribe(onNext);
}
用Kotlin就是这样
RxBus.get().register(LogoutEvent::class.java,{
refresh()
})
简化写法就是这样,由于最后一个参数是一个方法或者说是一个闭包,可以把方法或者闭包提到最外面。
RxBus.get().register(LogoutEvent::class.java) { refresh() }
四、不需要findViewById
使用Kotlin Android Extensions插件即可实现该功能。
我们在各个modules的build.gradle中添加该插件,即可使用。
apply plugin: 'kotlin-android-extensions'
布局文件中的id,可以直接在代码中使用。
例如MainActivity,它的布局文件是activity_main.xml
则按照如下的方式进行import
import kotlinx.android.synthetic.main.activity_main.*
布局中的控件ID就能直接在activity中使用。
结语
还有很多值得分享的地方,后续会继续写关于这方面的内容。