前言
最近看了<无问西东>,有那么一丢丢小感想.我特别认同,这个观点:思考人生并不是浪费时间的事情,许多伟大的人
也经常思考生命的意义,生活的意思.怎么样做到对自己真实,弥足珍贵.
还有就是请忽略都是英文标点符号!!!我很懒,切换太累了.
长时间加班真滴很累,吐槽完还是得继续啊~~
复制代码
1) lambda 表达式的使用
jdk1.8就能够使用lambda表达式了。在android开发中,使用lambda表达式可以省去写匿名内部类,最简单的例子那就是对view设置点击事件. koltin的lambda表达式,拥有更多的futures,请允许小学生开始表演:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
action();//具体逻辑
}
});
复制代码利用lambda表达式可以省略成这样
button.setOnClickListener{ action() }
复制代码可能有些对lambda表达式不熟悉的同学就比较困惑了,为什么{ }包起来的就是一个lambda式子,就可以省去写匿名内部类. 下面我将给大家分析一下;
lambda表达式完整的语法格式: eg:
1.
val sum={a:Int,b:Int -> a+b }
复制代码如果我们把可选标注留下,上述式子就是如下样子:
2.
val sum:(Int ,Int) ->Int ={ a,b -> a+b}
复制代码在kotlin中,函数也是一个对象,所以上述式子可以理解为,只读变量sum 是一个入参为两个Int值,返回值也是Int的一个函数类型, 而该函数的具体类型是{ a,b -> a+b}
kotlin有个特性,当函数返回类型可推断时,可以省略类型,即省略函数型申明,2式就可以简化成1式;
知道了上面这个,让我们再回过头来分析一下
button.setOnClickListener{ action() }
复制代码的由来.
button的setOnclickListener接受一个OnviewClick对象o,回调执行o.onClick(View v)方法; 那么其入参可以写成:
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;
尝试一波知识变现,来人啊打赏(只是玩玩,原谅我的厚颜无耻 哈哈哈哈)
上图:
复制代码
















