Scala匿名函数Lambda表达式详解
1 前言
大家好,我是楚生辉,在未来的日子里我们一起来学习大数据相关的技术,一起努力奋斗,遇见更好的自己!
本文详细的介绍了
scala的匿名函数
,有需要的小伙伴可以学习~
Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体。
使用匿名函数后,我们的代码变得更简洁了,让我们程序员估计关注于逻辑处理
下面的表达式就定义了一个接受一个Int类型输入参数,返回值为x+1
匿名函数:
(x:Int) => x+1
2.快速入门
没有名字的函数就是匿名函数。
(x:Int)=>{函数体}
x:表示输入参数类型;Int:表示输入参数类型;函数体:表示具体代码逻辑
在快速入门的案例中,我们定义了一个dualFunction函数,在这个函数中,传入一个函数作为参数,实现简单的加减运算
def main(args: Array[String]): Unit = {// 定义一个二元运算函数,只操作1与2两个数,但是具体的运算通过参数传递def dualFunction(fun:(Int,Int) => Int ) : Int = {fun(1,2)}// 定义 add与minus两个匿名函数val add = (a:Int,b:Int) => a + bval minus = (a:Int,b:Int) => a - bprintln(dualFunction(add))println(dualFunction(minus))// 或者我们可以直接把匿名函数定义在参数中println(dualFunction((a:Int,b:Int) => a + b))println(dualFunction((a:Int,b:Int) => a - b))// 因为a与b只出现过一次,所以直接可以用_来代替,如果顺序是b-a,我们可以转化为// -a + b 也即 -_ + _println(dualFunction(_ + _))println(dualFunction(_ - _))
}
3.案例实操
3.1 传递一个参数
需求 1:传递的函数有一个参数
传递匿名函数至简原则:
- 参数的类型可以省略,会根据形参进行自动的推导
- 类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参 数超过 1 的永远不能省略圆括号。
- 匿名函数如果只有一行,则大括号也可以省略
- 如果参数只出现一次,则参数省略且后面参数可以用_代替
def main(args: Array[String]): Unit = {// (1)定义一个函数:参数包含数据和逻辑函数def operation(arr: Array[Int], op: Int => Int) = {for (elem <- arr) yield op(elem)}// (2)定义逻辑函数def op(ele: Int): Int = {ele + 1}// (3)标准函数调用val arr = operation(Array(1, 2, 3, 4), op)println(arr.mkString(","))// (4)采用匿名函数val arr1 = operation(Array(1, 2, 3, 4), (ele: Int) => {ele + 1})println(arr1.mkString(","))// (4.1)参数的类型可以省略,会根据形参进行自动的推导;val arr2 = operation(Array(1, 2, 3, 4), (ele) => {ele + 1})println(arr2.mkString(","))// (4.2)类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过 1 的永远不能省略圆括号。val arr3 = operation(Array(1, 2, 3, 4), ele => {ele + 1})println(arr3.mkString(","))// (4.3) 匿名函数如果只有一行,则大括号也可以省略val arr4 = operation(Array(1, 2, 3, 4), ele => ele + 1)println(arr4.mkString(","))//(4.4)如果参数只出现一次,则参数省略且后面参数可以用_代替val arr5 = operation(Array(1, 2, 3, 4), _ + 1)println(arr5.mkString(","))
}
3.2 传递两个参数
需求 2:传递的函数有两个参数
object TestFunction {def main(args: Array[String]): Unit = {def calculator(a: Int, b: Int, op: (Int, Int) => Int): Int = {op(a, b)}// (1)标准版println(calculator(2, 3, (x: Int, y: Int) => {x + y}))// (2)如果只有一行,则大括号也可以省略println(calculator(2, 3, (x: Int, y: Int) => x + y))// (3)参数的类型可以省略,会根据形参进行自动的推导;println(calculator(2, 3, (x , y) => x + y))// (4)如果参数只出现一次,则参数省略且后面参数可以用_代替println(calculator(2, 3, _ + _))}
}
3.3 多层嵌套函数
定义一个函数func,它接受一个一个Int类型的参数,返回一个函数f1,它返回的函数fi,接受一个String类型的参数,同样返回一个函数f2,函数f2接收一个Char类型的参数,返回一个Boolean的值,如果传入0,空字符串,0就返回false
def main(args: Array[String]): Unit = {def func(i: Int): String => (Char => Boolean) = {def f1(s: String): Char => Boolean = {def f2(c: Char): Boolean = {if (i == 0 && s == "" && c == '0') false else true}f2}f1}println(func(0)("")('0'))println(func(0)("")('1'))
}// 返回值为
false
true
func(0)("")('0')
func(0)代表f1,func(0)(“”)则代表的f2
Scala匿名函数Lambda表达式详解相关推荐
- java拉姆达表达式事例,Java Lambda表达式详解和实例
简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
- 好程序员前端教程之JavaScript闭包和匿名函数的关系详解...
好程序员前端教程之JavaScript闭包和匿名函数的关系详解 本文讲的是关于JavaScript闭包和匿名函数两者之间的关系,从匿名函数概念到立即执行函数,最后到闭包.下面一起来看看文章分析,希望你 ...
- python 匿名函数示例_扣丁学堂Python3开发之匿名函数用法示例详解
扣丁学堂Python3开发之匿名函数用法示例详解 2018-07-26 14:01:11 1324浏览 今天扣丁学堂Python培训给大家分享关于Python3匿名函数用法,结合实例形式分析了Pyth ...
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)
2019独角兽企业重金招聘Python工程师标准>>> C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量捕获,同样没有参 ...
- java lambda表达式详解_Java8新特性Lambda表达式详解
课程目标: 通过本课程的学习,详细掌握Java8新特性之Lambda表达式: 适用人群:有Java基础的开发人员: 课程概述:从Java 8出现以来lambda是最重要的特性之一,它可以让我们用简洁流 ...
- 【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )
文章目录 一.函数头声明 二.函数参数 1.默认参数值 2.具名参数 三.Unit 函数 四.TODO 函数抛出异常返回 Nothing 类型 五.反引号函数名 六.匿名函数 七.匿名函数的函数类型 ...
- C# Lambda表达式详解,及Lambda表达式树的创建
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- 14_python基础—匿名函数lambda表达式
文章目录 一.lambda 表达式 1.1 lambda的应用场景 1.2 lambda语法 快速入门 1.3 示例:计算a + b 1.3.1 函数实现 1.3.2 lambda实现 1.4 lam ...
最新文章
- ASP.NET基础教程-DataTable类对象-属性方法和事件
- 推荐8个能极大提高办公效率的软件,让你告别加班
- python遍历文件夹下所有文件大小_python遍历文件夹读取文件大小 | 学步园
- avformat_alloc_output_context2 -22错误
- proc文件的简单读写
- 最新的Java SE平台和JDK版本发布计划
- 关于JAVA中子类和父类的构造方法
- ArcMap中的名称冲突问题
- JDK 9中已弃用Java的Observer和Observable
- 远控免杀专题1---基础篇
- C/C++蓝桥杯1 备赛准备
- 安卓mysql插入数据_Android批量插入数据到SQLite数据库的方法
- Python中的staticmethod和classmethod
- 史上最简易无人机,仅有一个螺旋桨
- java html模板_Java实现静态页面模板替换内容代码
- 借助echarts制作酷炫3d地球动画
- C++实现控制台迷宫小游戏
- c#实现短信发送程序
- springcontext.xml 中方言是红色的_12种方言都能听懂!讯飞智能录音笔A1评测:小如钥匙坠+复古磁带造型...
- 【山无遮,海无拦】LeetCode题集 线性枚举之最值算法
热门文章
- 02.17 Kalevitch and Chess
- 我眼中的设计模式(3)
- HTML点击元素以外任意地方隐藏该元素
- 采用matlab编制含电气热的综合能源优化程序,采用yalmip和cplex求解,通过二阶锥模型实现相关约束限制
- 由于缺少调试目标,无法开始调试。请生成项目并重试,或者相应的设置OutputPath和AssemblyName属性,使其指向目标程序集的正确位置。
- 2.14调情方案之个性情人节
- [USACO17DEC]Haybale Feast G
- solidworks中装配体如何旋转一个零件
- XPS电脑没有声音的问题
- android百度定位定位点返回非常慢,Android 定位之百度地图定位 问题总结