前言

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



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;
尝试一波知识变现,来人啊打赏(只是玩玩,原谅我的厚颜无耻 哈哈哈哈)
上图:
复制代码