kotlin与java的比较,如果让我用三个字来总结,那么我会说:很舒服,kotlin以一种很巧妙的设计让我们少写了很多重复的代码,对于android开发来说,我们不用在每个Bean类中添加一堆的set和get方法,让我最舒服的是,连Activity中的findViewById都不用写了,直接可以引用xml布局文件中的id作为对象来使用(前提是要加入 ‘kotlin-android-extensions’ 这个插件)。好了,废话不多说,本篇的话题是在android中如何让kotlin和lambda完美结合,写一手清晰简洁的代码。
1.开启一个线程
在java中,我们开启一个线程来执行某个耗时任务,一般会这么写
new Thread(){
@Override
public void run() {
super.run();
//to do something
}
}.start();
这样的代码显然是不太美观的,那我们来看一下kotlin怎么写:
object:Thread(){
override fun run() {
super.run()
//to do something
}
}.start()
kotlin中的object关键字有多种用处,在这里的作用其实和java一样,就是创建一个内部类对象继承自Thread,这样写好像并没有多大变化…别急,我们先建名叫newThread的函数,如下:
fun newThread(todo:()->Unit){
object:Thread(){
override fun run() {
super.run()
todo()
}
}.start()
}
这个函数的参数,就是一个lambda表达式,todo
是变量名,类型是一个无参无返回值的(kotlin中Unit 等同于java中的void)函数
,可以看到,newThread函数创建了一个线程并执行,执行的是todo函数里面的内容。newThread的功能就好比“你传一个函数给我,我开启一个线程帮你执行”的意思,那我们来看看怎么调用:
newThread {
//to do something
}
是不是很简单呢?这样子,我们就避免了谜之缩进了。其实Kotlin早已考虑到这一点了,我们只要打开Thread.kt这个文件,就可以看到类似的函数了。
public fun thread(start: Boolean = true, isDaemon: Boolean = false, contextClassLoader: ClassLoader? = null, name: String? = null, priority: Int = -1, block: () -> Unit): Thread {
val thread = object : Thread() {
public override fun run() {
block()
}
}
if (isDaemon)
thread.isDaemon = true
if (priority > 0)
thread.priority = priority
if (name != null)
thread.name = name
if (contextClassLoader != null)
thread.contextClassLoader = contextClassLoader
if (start)
thread.start()
return thread
}
2.接口回调
做Android开发的朋友,多多少少都会都一些异步操作,最常见的就是网络请求了,一般网络请求都是异步执行的,举个例子,我们要从model层获取一个数据,可以这样写:
interface DataListener{
void success(Data data);
}
public void getData(DataListener listener){
//获取数据
Data data = new Data()
//获取成功->data
if(listener!=null){
listener.success(data)
}
}
这种是比较常规接口回调,在android中经常会看到,首先要定义一个接口,然后调用getData的时候创建DataListener的实现类对象。如下:
getData(new DataListener() {
@Override
public void success(Data data) {
System.out.print(data.toString());
}
});
好,接下来我们上kotlin对比:
fun getData(success:(d :Data)->Unit){
//获取数据
val dat = Data()
//获取成功->data
success(dat)
}
然后调用是这样的:
getData {
println(it)
}
额,还是那个不太健康的词:舒服…可以看到,接口都不需要定义了,参数还是lambda表达式,接收一个函数(参数是类型是Date,无返回值),其中it就是那个返回的data对象。
好了,先写到这里,如果发现更多巧(zhuang)妙(bi)的写法,会继续奉上。写这一篇文章,单纯是为了推荐kotlin这门语言,特别是在android上,能发挥不俗的效果,再加上lambda,那简直就是锦上添花,其实在写kotlin的过程中,会发现系统api中就会有很多这样的写法,但是我们不但要会用系统的api,还要会自己设计这样的写法,提高开(zhuang)发(bi)效(ji)率(qiao)。
更多安卓知识体系,请关注公众号: