Kotlin 进阶教程(一)

前言

最近看了<无问西东>,有那么一丢丢小感想.我特别认同,这个观点:思考人生并非浪费时间的事情,许多伟大的人
也常常思考生命的意义,生活的意思.怎么样作到对本身真实,弥足珍贵.
 还有就是请忽略都是英文标点符号!!!我很懒,切换太累了.
长时间加班真滴很累,吐槽完仍是得继续啊~~
复制代码

1) lambda 表达式的使用

jdk1.8就可以使用lambda表达式了。在android开发中,使用lambda表达式能够省去写匿名内部类,最简单的例子那就是对view设置点击事件. koltin的lambda表达式,拥有更多的futures,请容许小学生开始表演:java

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                action();//具体逻辑
            }
        });

复制代码

利用lambda表达式能够省略成这样android

button.setOnClickListener{  action() }
复制代码

可能有些对lambda表达式不熟悉的同窗就比较困惑了,为何{ }包起来的就是一个lambda式子,就能够省去写匿名内部类. 下面我将给你们分析一下;bash

lambda表达式完整的语法格式: eg:app

1.
val sum={a:Int,b:Int -> a+b }
复制代码

若是咱们把可选标注留下,上述式子就是以下样子:ide

2.
val sum:(Int ,Int) ->Int ={ a,b -> a+b}
复制代码

在kotlin中,函数也是一个对象,因此上述式子能够理解为,只读变量sum 是一个入参为两个Int值,返回值也是Int的一个函数类型, 而该函数的具体类型是{ a,b -> a+b}函数

kotlin有个特性,当函数返回类型可推断时,能够省略类型,即省略函数型申明,2式就能够简化成1式;ui

知道了上面这个,让咱们再回过头来分析一下this

button.setOnClickListener{ action() }
复制代码

的由来.google

button的setOnclickListener接受一个OnviewClick对象o,回调执行o.onClick(View v)方法; 那么其入参能够写成:spa

button.setOnClickListener(o:(view:View) -> Unit)
复制代码

传入具体lambda函数对象:

button.setOnClickListener({view -> action()})
复制代码

==>kotlin中当函数只有一个参数时,参数能够省略:

button.setOnClickListener({action()})
复制代码

==>kotlin中,当函数参数是函数的最后一个参数时,能够在()后指定它,因此能够表示成:

button.setOnClickListener(){action()}
复制代码

==>kotlin中,当函数参数是函数的惟一参数,能够省略(),因此能够表示成:

button.setOnClickListener{action()}
复制代码

上述这个式子就是我文章开头写的式子; 不知道你们看到这里有没有明白呢?

不知道你们有没有思考过一个问题呢,函数参数只有一个参数时,咱们省略了参数,那若是这个参数我须要在函数体中使用,那该怎么办呢? 有人可能会说,那我就不省略它呗.这点没错,显式申明入参,在函数体中能够直接使用该参数,但在kotlin中,会隐含的为咱们声明其名称:"it"; 因此 须要给当前view设置文本能够以下表示:

button.setOnClickListener{ action()
 it.text="google Jiang"
}
复制代码

这里的it就表示view;

2)扩展函数

kotlin强大之处,就是它支持的扩展函数.在java中,咱们为某个类增添一个方法一般,须要继承该类,并增长一个方法; 在kotlin中能够免去这样的操做 举个栗子:

public class Foo{
 public void sing(String song){
   	Log.d(TAG,"Foo sing:"+song)
	}
}
复制代码

要为该类增长一个talk()方法,用kotlin能够这么写:

Foo.talk(talk:String ){
 Log.d(TAG,"Foo talk: $talk")
}

Foo().apply{sing("慢慢喜欢你")}.talk("lovely")
复制代码

结果Log输出:

Foo sing:慢慢喜欢你

Foo talk:lovely

kotlin中有一个标准的函数库StandardKt.class,定义了许多扩展函数apply,run ,let等等.....; 咱们能够分析一下apply源码,带你们了解一下扩展函数的意义:

@1
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
复制代码

咱们来具体分析一下apply函数: inline表示内联函数,若是不懂什么意思咱们先忽略,有时间我再说一下, T是泛型,T.apply表示在T类上扩展一个apply函数,其入参block为一个无返回值的函数对象,apply返回值是T类型,函数具体执行的是入参block(),而且把自身返回去,即返回T;

看到这里必定有小伙伴疑惑了,这个block函数T.()->Unit 究竟是啥意思?

联系一下上面讲到的lambda标准表达式,->左边表示参数,右边表示返回值 因此block 参数就是T.(),表示入参是T的一个函数; block的返回值就是void; 因此,apply能够作到,对任意对象T,调用T.apply{ },传入T的一个函数fun1,执行fun1,而且返回T自己,这样就能够作到链式调用了;

结束

纯手打,就分析到这了,文章比较短(ps能逼逼这么多已经很不容易了);
以上有理解错误的地方,还请指出,我仍是个小学生QAQ;
尝试一波知识变现,来人啊打赏(只是玩玩,原谅个人厚颜无耻 哈哈哈哈)
上图:
复制代码

相关文章
相关标签/搜索