Kotlin高阶函数与函数式编程详解
函数可变参数:
在上一次https://www.cnblogs.com/webor2006/p/11518425.html中学到了可变参考,关于可变参数有如下规则说明:
“一个方法中,只允许一个参数为vararg,通常作为最后一个参数,如果vararg不是最后一个参数,那么其后的参数就需要通过具名参数形式进行传递;如果其后的参数是函数类型,那么还可以通过在圆括号外传递lambda表达式来实现。”
下面来看下代码:
下面再来看另一种方式:
中缀符号(infix notation):
函数还可以通过中缀符号形式来调用,需要满足如下3个条件:
1、是成员函数或扩展函数。
2、拥有单个参数。
3、声明时使用infix关键字。
下面用代码来进行说明:
接下来改用中缀调用法,如下:
日常开发中用得不多,但是得了解。
内联函数(inline fuction):
在C++中也有内联,下面看一下在Kotlin内联函数的用法:
调用跟用普通方法木有任何区别:
那。。内联和非内联函数有啥区别呢?下面来查看一下字节码文件来揭晓其答案,先将inline关键字去掉,反编译看一下它在字节码的表现:
下面来仔细读一下main()方法的助记符:
好,接下来将其改为内联函数,再次反编译看结果:
确实这俩本质区别还是比较大的。
高阶函数(high-order fuction)与Lambda:
啥是高阶函数其实在Java8中已经学习过了,简单说就是一个函数接收了另外一个函数作为参数或者是返回一个函数作为返回值,下面先对Lambda表达式格式要求进行总结一下:
1、一个Lambda表达式总是被一对花括号所包围。
2、其参数(如果有的话)位于 -> 之前(参数类型可以省略掉的)。
3、执行体位于 -> 之后。
在Kotlin中,如果一个函数的最后一个参数是个函数,那么可以将lambda表达式作为实参传递进去,并且可以在调用时方法圆括号外去使用。
下面定义几个Lambda表达式:
其实类型声明是可以省略掉的,如下:
接下来再来看一个:
呃,这个Lambda表达式有点奇怪,其实它的类型是这样的:
接下来再来定义一个特殊的:
还可以这样进行简化:
最后再来看一个,如果是整个函数都可能为空,而非只是返回值,就可以这样来定义:
Kotlin高阶函数与函数式编程详解的更多相关文章
- Kotlin高阶函数实战
前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...
- Java8 函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- kotlin高阶函数实战&DSL入门
传统函数演示: 这里以电视节目“非诚勿扰”为例,男人去从一大堆美女当中挑选出自己中意的对象,比如台上有24位妹子,其档案如下: 接下来第一个男嘉宾出场啦,如下: 下面用代码来实现一下,比较简单: 先定 ...
- C#中面向对象编程中的函数式编程详解
介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
- Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...
- Python---12函数式编程------12.1高阶函数
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- python3 第二十章 - 函数式编程之Higher-order function(高阶函数)
什么是高阶函数?把函数作为参数传入或把函数做为结果值返回,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式.函数式编程的特点: 函数本身可以赋值给变量,赋值后变量为函数: 允许将函数本身 ...
随机推荐
- 【数据集】FDDB-Face Detection Data Set and Benchmark
前言 参考 1. FDDB官网: 完
- python进阶---列表、字典、集合相关操作
基本概念 列表 序列是python中一个基本的数据结构,每个元素都有一个索引index 操作 # 创建列表 list = [] # 修改列表 list[2] = 2001 # 删除列表 del lis ...
- [数据结构 - 第3章] 线性表之双向链表(C语言实现)
一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...
- Oracle中恢复drop掉的表中的数据
今天同事不小心把生产上的一张表直接drop掉了,没有做备份,哥们慌的一匹,来找我这个小白来帮忙解决,于是心血来潮简单总结一下. 其实在oralce中,用drop删掉一张表,其实不会真正的删除,只是把表 ...
- 世界视频编码器大赛结果揭晓,腾讯V265编码器勇夺两项第一
2019年10月22日,由莫斯科国立大学(Moscow State University)举办的MSU世界视频编码器大赛成绩揭晓, 腾讯内部开源协同的V265编码器再创佳绩,一举拿下PSNR(峰值信噪 ...
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
- mysql求中位数
实例1: SET @ID = 0; SELECT AVG(loan_amount) from ( SELECT @ID:=@ID+1 as ID, loan_amount FROM table_x ...
- BJFU-216-基于链式存储结构的图书信息表的修改
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct Book{ double no; cha ...
- ZYNQ笔记(3):GPIO的使用(MIO、EMIO)——led灯
一.GPIO原理 1.GPIO介绍 程序员通过软件代码可以独立和动态地对每个 GPIO 进行控制,使其作为输入.输出或中断. (1)通过一个加载指令,软件可以读取一个 GPIO 组内所有 GPIO 的 ...
- 三伏天里小试牛刀andriod 开发 #华为云·寻找黑马程序员#【华为云技术分享】
2019年07月,北京,三伏天,好热啊.越热自己还越懒得动换(肉身给的信号),但是做为产品经理/交互设计师的,总想着思考些什么(灵魂上给的信号),或者是学习些什么,更有利于将来的职业发展吧,哈哈哈.工 ...