继续学习Kotlin反射相关的东东。
KClass:
在上一次是通过类来获取它的KClass对象:
![](https://i-blog.csdnimg.cn/blog_migrate/4ad42db75682109ffabcae6c68414367.png)
那如果是一个对象呢?与这个对象对应的类的KClass对象又是如何获取的呢?像Java也是一样有相关机制的,下面看一下:
![](https://i-blog.csdnimg.cn/blog_migrate/7b01c69cedac42bd892d4c35412b15a9.png)
其实使用跟用类是一样的,那结果是啥呢?运行一下:
![](https://i-blog.csdnimg.cn/blog_migrate/469c10259becc28ce3ab3adab1e4d8d7.png)
这样就打出来了具体类型了,由于是咱们自己定义的类,所以其KClass和Class是同一个,跟上一次用的系统类输出是不一样的。
函数(方法)引用:
由于在之前JAVA8中已经详细学习过方法引用了,就不多解释了,它其实是Lambda表达式的一种更加简洁的写法, 下面来看一下在Kotlin中的使用:
![](https://i-blog.csdnimg.cn/blog_migrate/f4eecd79b43a44f694bdb781194bedcf.png)
这里当然得用Lambda表达式的方式喽,具体如下:
![](https://i-blog.csdnimg.cn/blog_migrate/729290c72548a79fdfcf8a4edea2b8a0.png)
对于函数引用其实也支持重载的方式,编译器会自动来选择对应的函数,啥意思,下面举例说明一下,再定义一个函数:
![](https://i-blog.csdnimg.cn/blog_migrate/7c60d05f87963e8c62e83aa64ef9253a.png)
接下来修改一下程序:
![](https://i-blog.csdnimg.cn/blog_migrate/89e6333dde2f1475f8b2d414fde861bc.png)
那,对于第一个"::mutiplyBy3"和第二个"::mutiplyBy3"倒底对应哪个类型呢?我们可以将一个函数引用赋值给一个变量,下面来看一下:
![](https://i-blog.csdnimg.cn/blog_migrate/8fffe3a8689823928982e06ac3756d5f.png)
上面这种函数是定义在包级别的,而非放在类中,那。。如果将函数定义在某个类中,那其方法引用又如何来写呢,比如说Kotlin中的String类:
![](https://i-blog.csdnimg.cn/blog_migrate/321408f0efd6d11378847d9a42672ad6.png)
那很明显它是一个实例方法,也可以用方法引用的方式来定义函数,所以我们可以这样写:
![](https://i-blog.csdnimg.cn/blog_migrate/61d569f982e1fe39a9914d79e27f71d9.png)
那请问下myRefrence3的类型声明应该是咋样的?很简单嘛:
![](https://i-blog.csdnimg.cn/blog_migrate/57508f75c205e6da8e8f40a9918c567b.png)
但此时是不对的,现在是类里面的函数了,所以应该要带上类了,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cd05a4caded4c2553280d2be1300c765.png)
要想比较轻松的理解Kotlin的方法引用,前提是要对Java8的方法引用有比较深刻的了解才行,不然这块确实是有些抽象。
一个较复杂的高阶函数(函数组合)演练:
啥叫高阶函数这里就不多说了,其实就是一个函数参数中是传的一个函数,也就是函数套函数,如今这种形式在很多的开源框架上都得到了大量的运用,所以下面定义一个比较绕的函数,然后将们的思维进行操练来适应这种新的编程范式,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/1ddf618c04705476ba7f7b0afe33049b.png)
晕了木有。。解释一下,其实要习惯这种函数链函数最终生成一个新的结果的方式:
![](https://i-blog.csdnimg.cn/blog_migrate/7fcd8f12f6ba0c695a276baf3946fe3f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ab756c3e20b15ec6849f4b55fcbb053c.png)
其实简单来说,就是A参数经过g函数生成的结果再作为f函数的参数再生成整个myCompose函数的结果,有点绕,其实如果Java8学得比较扎实的话看这种程序其实是比较顺其自然的,就是函数式编程的范示,下面来完成整个函数的函数体:
![](https://i-blog.csdnimg.cn/blog_migrate/1b7b9b1aeefd126fc30dfc3c64ce6ab3.png)
那定义这个组合函数有啥用呢?由于该函数需要两个函数做为参数,所以在调用之前再定义两个函数:
![](https://i-blog.csdnimg.cn/blog_migrate/b5fd7acb53df4ae58bd4ead45a577a16.png)
那接下来调用一下myCompose(),其效果是从字符串集合中找出其字符串长度是偶数的元素,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/ca0b9aa4a2e512d714b1018a5654f5c8.png)