scala中“=>”的4种使用场景
一直以来都对scala中“=>”的使用比较迷茫,也不知道他表示什么意思。今天就它的使用场景列举如下,希望可以共同探讨。
表示函数的返回类型(Function Type)
scala> def double(x: Int): Int = x*2
double: (x: Int)Int
//定义一个函数变量:
scala> var x : (Int) => Int = double
x: Int => Int = <function1>
//调用
scala> x(2)
res1: Int = 4
函数double的类型就是 (x: Int) => Int 或者 Int => Int。左边是参数类型,右边是方法返回值类型。
备注: 当函数只有一个参数的时候,函数类型里面括起来函数参数的括号是可以省略的。
匿名函数
//通过匿名函数定义一个函数变量xx
scala> var xx = (x: Int) => x + 1
xx: Int => Int = <function1>
//给一个高阶函数,传递一个函数:
scala> val newList = List(1,2,3).map { (x: Int) => x * 2 }
newList: List[Int] = List(2, 4, 6)
匿名函数定义, 左边是参数 右边是函数实现体 (x: Int)=>{}
case语句
scala> val x = 10; val y = 20
x: Int = 10
y: Int = 20 scala> val max = x > y match {
case true => x
case false => y
}
max: Int = 20
在模式匹配 match 和 try-catch 都用 “=>” 表示输出的结果或返回的值
By-Name Parameters(传名参数),传名参数在函数调用前表达式不会被求值,而是会被包裹成一个匿名函数作为函数参数传递下去,例如参数类型为无参函数的参数就是传名参数。
scala> def doubles(x: => Int) = {
println("Now doubling " + x)
x*2
}
doubles: (x: => Int)Int
//调用函数
scala> doubles(3)
Now doubling 3
res2: Int = 6 scala> def f(x: Int): Int = {
println(s"Calling f($x)")
x
}
f: (x: Int)Int
//调用函数
scala> doubles(f(3))
Calling f(3)
Now doubling 3
Calling f(3)
res9: Int = 6
对于函数doubles而言,它的参数x就是by-name的。如果调用doubles的时候,直接给个普通的值或者非函数变量。那么doubles的执行结果就跟普通的函数没有区别。但是当把一个返回值为Int类型的函数,例如f(2),传递给doubles的时候。那么f(2)会被先计算出返回值2,返回值2传入doubles参与运算。运算完成以后,f(2)会被doubles在执行以后,再调用一遍。
scala中“=>”的4种使用场景的更多相关文章
- jmeter中的几种参数化场景
1.request路径中引用参数 2.body中引用参数 3.parameter中引用参数 4.header中引用参数,如token这类跟用户相关参数 5.response assertion中引用参 ...
- Programming In Scala笔记-第十七章、Scala中的集合类型
本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...
- Scala 中Array,List,Tuple的差别
尽管学了一段时间的Scala了,可是总认为基础不是太扎实,还有非常多的基础知识比較模糊.于是近期又打算又一次学习基础. Scala中的三种集合类型包含:Array,List,Tuple.那么究竟这三种 ...
- Scala学习2 ———— 三种方式完成HelloWorld程序
三种方式完成HelloWorld程序 分别采用在REPL,命令行(scala脚本)和Eclipse下运行hello world. 一.Scala REPL. 按照第一篇在windows下安装好scal ...
- scala中Either的一种使用场景
用scala有一年多了,对于scala中的Option和Try使用的较为频繁,对其应用场景相对熟悉一些.而对于Either,仔细回想一下却发现几乎(完全)没有使用过,其实并不是没有遇到过Either的 ...
- java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例
这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...
- Scala中apply的用法
Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...
- Scala 深入浅出实战经典 第51讲:Scala中链式调用风格的实现代码实战及其在Spark中应用
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 中方法扩展实践
前言 这个名字不知道取得是否合适,简单来说要干的事情就是给某个类型添加一些扩展方法,此场景在各种语言中都会用到,比如 C# 语言,如果我们使用一个别人写好的类库,而又想给某个类库添加一些自己封装的方法 ...
随机推荐
- C++异常安全
转自:http://www.cnblogs.com/zgfLawliet/p/3417308.html 异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异 ...
- Mac终端下 连接 ubuntu 16.04 ssh root@*.*.*.* permission denied 问题解决方案
默认 Ubuntu 不开启 ssh 服务 (1)检查是否开启SSH服务 命令:ps -e|grep ssh 查看SSH服务是否开启,或者通过命令:service sshd status 可以查看某 ...
- 第五周 day5 python学习笔记
1.软件开发的常规目录结构 更加详细信息参考博客:http://www.cnblogs.com/alex3714/articles/5765046.html 2.python中的模块 ...
- gogs配置及迁移
工作需要迁移gogs,粗略记下笔记 操作系统:CentOS Linux release 7.4.1708 (Core) 防火墙:关闭状态,如有需要开启默认的3000端口 一.配置 首先安装git [r ...
- January 23 2017 Week 4 Monday
Knowledge is long, life is short. 吾生也有涯,而知也无涯. I often feel that I have a lot of things to learn, ne ...
- scanf函数读取缓冲区数据的问题
标准I\O的缓冲类型 标准I\O根据不同的应用需求,提供了全缓冲.行缓冲.无缓冲三种缓冲方式. 全缓冲:只有当划定的缓冲区被填满或者数据读取至末尾时,才开始执行I\O操作(执行系统提供的read\wr ...
- CoreAnimation confusion: CATransaction vs CATransition vs CAAnimationGroup?
http://stackoverflow.com/questions/14042755/coreanimation-confusion-catransaction-vs-catransition-vs ...
- [JLOI2016/SHOI2016]侦察守卫
嘟嘟嘟 这道题可以说是[HNOI2003]消防局的设立的升级版.距离从2改为了d. 辛亏d只有20,这也就是一个切入点. 令f[u][j]表示u四周 j - 1的距离需要被覆盖,g[u][j]表示u可 ...
- phpstudy mysql 升级5.7.18
1.从官网下载MySQL http://dev.mysql.com/downloads/mysql/ 2.解压到想安装到的 例如 C:\phpStudy\MySQL 进入该目录,找到my-defua ...
- 如何用javasript对Gridview的项目进行汇总统计?
当我们在gridview显示统计信息时,都会想在gridview最后一行显示[小计]结果,但gridview的话好像比较难搞(至少我也不会呀 囧~),那么我就结合jquery写了一个解决方案,下面举个 ...