在Kotlin中使用lambda

     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)。

更多安卓知识体系,请关注公众号:
三分钟Code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值