Kotlin的高阶函数和常用高阶函数
Kotlin的高阶函数和常用高阶函数
高阶函数的定义
将函数当做参数或者是返回值的函数
什么是高阶函数
可以看看我们常用的 函数:
首先我们可以知道, 是 的扩展函数,然后参数是 ,但是 不再像和我们以前Java那样传递的是一个对象,这时传递的是一个函数。这个函数的入参为 ,返回值为 。所以 也是一个高阶函数,因为它将函数当做参数进行传递了。我们尝试着去调用一下 函数:
调用的时候,我们将 函数传递给了 函数,这里采用的是函数引用。就上诉代码,我们还可以结合 表达式来进行处理:
其实以上几种的方式得到的结果都是一样的,但是第一种就是简洁了许多。
我们再定义一个类,用来打印 的值:
根据函数引用的特性,我们可以这样调用 函数:。由于 中的 函数的入参类型是 类型,也就是任意类型,不管 传递的是什么值都可以接收。那现在我们再将其作为 的参数传递进去:
编译器告诉我们这个是错误的。那我们来分析一下吧:我们再定义一个 类
然后进行以下操作:
可以看到 分别对 和 的解释:
是一个方法,然后参数类型为 ,返回值为
也是一个方法,但是参数有两个,分别是 和 类型, 返回值为
在 中,只有一个参数传递,但是 需要的是两个参数,肯定就会报错,所以我们需要对此进行修改:
这个样子就OK了。
常用高阶函数
map:变换
通常我们会使用以下的方式来实现对集合中的元素进行修改的操作:
如果采用这种方式,远远不能体现Kotlin的优势了,这个和Java有什么区别呢?「狗子,上map」:
从打印结果可以看到他们的实现效果是一模一样的,这个就是 的功能,可以对集合中的元素进行你想要的操作,是不是跟 的 很类似呢!我们来细看一下 的实现原理:
方法中主要做的就是调用 方法,然后传递的是新创建并且初始长度为10的 和 函数,在 方法中,对集合进行迭代,然后将进行变换后的数据添加到新的集合中,最后返回新的集合。
操作不仅可以将元素变换成与之前类型相同的元素,也可以变化成与之前元素类型不同的元素,具体你想变换成什么类型,这个是不做限制的。
flatMap:变换
看起来跟 很相似,其实真的很类似,搞得有时候自己都不知道应该使用哪个操作符了,那就从源码来看看它们之间的区别吧。
可以看到 中的参数 是一个返回值为 的函数,而 的参数 是一个返回值为 的函数。然后调用 方法,将 和一个新创建的 传递给了 方法。在 方法中,对当前的集合进行了迭代,然后将执行过变换操作后的集合数据全部添加到新的集合中,最终返回新的集合。
和 的主要区别就是在于传入的函数的返回值,一个是任意对象,一个是实现了 接口的对象
reduce
例子:打印集合中的元素之和
还是直接对源码进行分析吧,感觉看了源码就一目了然了。
首先对当前的集合进行判空处理,接着将第一个元素赋值给 , 的类型是 。然后对当前集合进行迭代处理,并调用我们传递进去的参数 , 函数中传递了两个参数,一个是 类型的,一个是集合元素类型的。 函数的返回值也是 类型的,将 的返回值重新赋值给 。迭代完毕以后返回我们的 。
其实通过我们解读源码以后,我们就可以知道 函数会将上一次的计算结果传递到下一次计算中,我们可以利用这个方式来实现以下字符串拼接,当然我们的字符串拼接有其他更好的方式,这里只是做为讲解 的例子而已:
fold:能够添加初始值的reduce
不得不说, 跟 的作用基本是一致的,只是 能够添加初始值,什么叫做能够添加初始值呢?让我们来举个栗子看看呗!
还是看源码吧:
看着源码就会觉得这些函数的操作很是简单了。 函数还有很多的兄弟:
说的再多也不如看结果
这个函数就是多了一个 的参数,具体的用处暂时没有发现,就不做数据打印了。
filter:过滤
例子:过滤集合中的奇数
上源码:
在 中创建新的集合 ,将 和 函数一并传递给 函数。在 函数中,先对当前的集合进行遍历,如果满足条件 就将当前的元素添加到新的集合中, 就是我们传递进来的那个函数,返回值是一个 类型的。
takeWhile:截取集合中的数据,直到第一个不满足条件的元素为止
例子:截取集合中不能够被5整除的数,直到第一个不满足条件的元素为止。
源码:
let:将调用者当做参数传递给指定的函数
例子:省略if空判断
源码:
源码也是很简单,就是将调用者传递给传入进来的函数并执行传入进来的函数。
apply:执行指定函数,并且返回调用者
例子:修改person类的age属性
上诉的例子真的只是例子,它没有跟你讲 有多强大,它只是描述了的作用。源码:
就是单纯的执行函数 并返回调用者。
with
例子:文件读取
源码:
接收两个参数,一个是 ,上诉例子中就是 ,另一个就是 ,在上诉例子中,我们使用了 表达式,所以这个函数就移到了括号外面了。
疑惑点
函数定义中 `T.() -> Unit` 和 `() -> Unit` 的区别
我们一般定义函数都会选择定义
上诉代码表示: 的扩展方法 接收一个 的函数,该函数是无参无返回的。
那我们再见识见识 这种方式定义的方法,其实也很多见了:
可以看到 函数使用的是 这种方式,他们两到底有啥区别呢?
我在 定义了两个方法:
分别使用 调用这两个方法试试:
从图片中可以看出 : 中的 对象指的是调用对象 ,也就是 ,而 没有提示,那么我们就看打印吧:
原来 方法中的 对象指的是外部对象,在这里就是我们的 对象。
总结
这两个函数唯一的区别就是 与 的区别,我们调用时,在代码块里面写this,的时候,根据代码提示,我们可以看到,连个this代表的含义不一样, 里的this代表的是自身实例,而 里,this代表的是外部类的实例
感谢
[Kotlin中,函数作为参数,T.()->Unit 和 ()->Unit 的区别][https://www.jianshu.com/p/88a656e59c61]
This is All
转载于:https://www.cnblogs.com/vana/p/10837702.html
Kotlin的高阶函数和常用高阶函数相关推荐
- 缔合legendre函数_常用超高阶次缔合勒让德函数计算方法对比分析.pdf
您所在位置:网站首页 > 海量文档  > 高等教育 > 理学 常用超高阶次缔合勒让德函数计算方法对比分析.pdf7页 ...
- desc excel 公式_Excel小技巧之Power Pivot Generate函数、高级DAX函数与常用筛选器函数...
一.使用Generate函数创建信息叠加表 [目标:将姓名与月份组合,生成每个月份均有对应姓名对应的表格][基本思路:pivot中创建度量值,利用DAX函数创建链接回表后在EXCEL释放] ...
- python中常见的内置函数_Python常用内置函数总结
Python 常用内置函数总结 一.数学相关 1 .绝对值: abs(-1) 2 .最大最小值: max([1,2,3]) . min([1,2,3]) 3 .序列长度: len('abc') . l ...
- day15 匿名函数及常用内置函数
""" 今日内容:1.生成器的send方法2.递归函数3.匿名函数4.匿名函数的应用5.常用的内置函数 """""&qu ...
- linux函数脚本,linux 函数_linux常用脚本和函数
摘要 腾兴网为您分享:linux常用脚本和函数,自动刷宝,英语字典,携程,享家等软件知识,以及智慧人社app,安卓终端,vdhcoapp,matebook管家,钦州智慧党建,商户号系统,税务app,济 ...
- 8.Hive基础—函数—系统内置函数、常用内置函数、自定义函数、自定义UDF函数、自定义UDTF函数
本文目录如下: 第8章 函数 8.1 系统内置函数 8.2 常用内置函数 8.2.1 空字段赋值 8.2.2 CASE WHEN THEN ELSE END 8.2.3 行转列 8.2.4 列转行 8 ...
- Python生成器的send方法、递推函数、匿名函数及常用内置函数
1.生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 1.1 什么是send方法? send方法相当于高级的next方 ...
- python 常用内置函数_python常用内置函数使用|python基础教程|python入门|python教程...
基础小函数.字符串函数.序列函数 序列.元组.列表小函数 max() 求最大值(列表.元组.序列) min() 求最小值 len() 求长度 >>> a = [1,2,3,4] &g ...
- php入口函数,php 常用的系统函数
字符串函数 strlen:获取字符串长度,字节长度 substr:字符串截取,获取字符串(按照字节进行截取) strchr:与substr相似,从指定位置截取一直到最后 strrchr(获取文件后缀名 ...
最新文章
- Play Framework 2.5 整合 MyBatis
- php编写一个学生类_Python零基础入门之编写测试实例
- 模拟spring IOC、源码分析
- 怎么在matlab中图像中外接矩形,Matlab 最小外接矩形
- 前端学习(2958):组件之间的参数传递子传父
- xcode w情ndows版,xcode Windows版安装使用介绍
- 滴滴图像技术团队招聘计算机视觉工程师和专家
- 2-1 git合并 打tag
- mysql测试题汇总_总结:SQL练习【SQL经典练习题】
- 最新房天下登录接口(RSA)JS逆向分析
- Eclipse、IntelliJ IDEA、TortoiseSVN清除svn帐号
- 【渝粤教育】国家开放大学2019年春季 2727税收基础 参考试题
- keepalived(二)vip漂移
- 通过Cadence学拉扎维的第1天-直流仿真、交流仿真、瞬态仿真和参数扫描(以上期共源为例)
- 【机器学习】监督学习的分类:判别/生成模型,概率/非概率模型、参数/非参数模型
- yapi 权限_yapi接口管理平台手册
- Goland DEBUG报错(could not launch process: decoding dwarf section info at offset 0x0: too short)
- 在Activity中获取另一个XML文件的控件
- 常用计算机系统包括,常用的保护计算机系统的方法有()。
- JavaScript高级程序设计(第4版)学习随笔【第六章】
热门文章
- ASP.NET学习笔记(11)--ASP简介
- 第5章 定时器Timer
- git使用--提交代码
- 《HTTPS权威指南》- SSL、TLS和密码学学习笔记
- dos 一行两条命令
- Android 蓝牙开发浅析
- Linux Shell常用技巧(十一)
- RUBY ON RAILS 插件收录: CACHE:Sweeper Generator
- Gradle sync failed: Minimum supported Gradle version is 3.3.Current version is 3.2
- 使用 SQL Server 2000 索引视图提高性能1