Scala学习笔记(二)表达式和函数
笔记的整理主要针对Scala对比Java的新特性;
1、if表达式
if表达式是有结果返回的。
val a= if (5>2) “你好” else 1
a的值为if表达式返回值为 “你好”
2、while表达式
while表达式是没有返回值的(返回值为 Unit),在scala中避免使用,通常都需要与var结合使用
3、for表达式
枚举集合遍历
val a = Array(1,2,3,4,5,6)
for (i <- a) println(i)
以上for表达式遍历的语法成为发生器,不仅仅只是适合Array也适合其它集合类;
for表达式中 to 与 until的区别:to包含上限,until不包含上限;
遍历过滤
for (i <- a if i>3) println(i)
if i>3称为发生器i <- a 的守卫,主要用于对发生器产生的数据进行过滤;
嵌套枚举
for (i <- 0 to 5 if i>1 ;j <- 5 to 10 if j<9 ) println("i:"+i+",j:"+j)
这里有两个发生器,每个发生器都带有一个守卫。
执行的顺序为:先对将 i 赋值为一个合法的值(即满足区间在0~5之间且i大于1),然后依次完成对 j 合法值(即满足区间在5~10之间且 j小于9)的所有遍历,然后对 i 进行下一个合法值的遍历赋值,再重复对 j合法值的所有遍历,后面的过程以此类推;
产生新集合结果
val a = for (i <- 0 to 10 if i>5) yield i
for-yield语法:for (表达式) yield{循环体}
4、本地函数
特点:在方法中定义的方法,且本地方法仅在包含它代码块中可见(类似局部变量);
5、头等函数
把函数当值传递(如同变量),函数字变量被编译进类,并在运行期实例化为函数值。因此函数自变量与值的区别在于函数自变量存在于源码,而函数值做为对象存在于运行期(类似类与对象之间的关系);
函数自变量的构成包含括号、参数列别、右箭头和函数体。如:(x:Int) => x+1 ; 右箭头左边为括号很参数,右边为函数体
当编译器能推断出参数类型时,参数类型可以省略:
var v = Array(1,2,3,4,5)
v.foreach(x => println(x+1))
6、占位符
把下画线当做一个或更多参数的占位符,只要每个参数在函数字面量内仅出现一次。
例如:
scala> v.filter(_ > 0)
res0: Array[Int] = Array(1, 3, 7)
7、部分应用函数
用单个下划线替换整个参数列表;
例如:
scala> def add (a:Int,b:Int) = a+b
add: (a: Int, b: Int)Int
scala> val sum = add _
sum: (Int, Int) => Int = <function2>
scala> sum(1,2)
res1: Int = 3
sum变量指向一个函数值对象,该函数值依照部分应用函数表达式add _,自动产生的类的一个实例,编译器产生的类有一个apply方法带两个参数,参数的个数有add _表达式缺少的参数数量确定;
另一种表现形式(转换函数值):
scala> def add(a:Int,b:Int) = a+b
add: (a: Int, b: Int)Int
scala> val sum = add(2,_:Int)
sum: Int => Int = <function1>
scala> sum(2)
res2: Int = 4
注意:一个省略所有参数的偏程序表达式(如:add _),且在代码的某个地方正需要一个函数,可以去掉下划线使表达式更简洁。如:scala> v.foreach(println)
8、可变参数
允许客户向函数传入可变长度参数列表,若想要标注一个重复参数,可在参数的类型之后放一个星号。
例1:
scala> def echo (args:String*)=
| for (arg <- args)println(arg)
echo: (args: String*)Unit
scala> echo()
scala> echo("hello","world")
hello
world
例2:
scala> var arr = Array("hello","world","chenx")
arr: Array[String] = Array(hello, world, chenx)
scala> def echo (args:String*)=for(arg <- args) println(arg)
echo: (args: String*)Unit
scala> echo(arr:_*)
重复参数的类型是声明参数类型的数组,当参数类型为一个合适类型的数组时,需要在数组参数后添加一个冒号和一个_*符号。
9、尾递归
方法的最后一个动作是调用自己的函数称为尾递归。Scala对尾递归的情况进行了优化,比基于循环的实现更优美很简明,因为无需付出任何运行期开销,且递归必须是直接的。
注:-g:notailcalls 参数传递给scala shell 或者scalac编译器,可用来跟踪堆栈信息。
10、柯里化
对柯里化的理解可以为根据方法参数的个数,对方法进行拆解,如:def f(a:Int,b:Int)=a+b 转换为 def f(a:Int)(b:Int)=a+b
例1:
scala> def f(a:Int)(b:Int)=a+b
f: (a: Int)(b: Int)Int
scala> val t = f(1)_
t: Int => Int = <function1>
scala> t(2)
res0: Int = 3
例2:
scala> def f(a:Int)=(b:Int)=>a+b
f: (a: Int)Int => Int
scala> val t=f(1)
t: Int => Int = <function1>
scala> t(2)
res1: Int = 3
对比两个例子有一定的不同,例1使用占位符号获取f的第二函数,由f(1)_返回,例2运用的是方法f返回一个函数值并进行的下一步调用;
11、控制抽象
在传入一个参数时,用花括号替代小括号的机制。当参数为函数字面量时让方法的调用更像控制抽象;
例:
scala> def f(msg:String)(op:String => Unit){
| op(msg)}
f: (msg: String)(op: String => Unit)Unit
scala> f("123456"){println(_)}
123456
该例中是将def f(msg:String,op:String => Unit)柯里化为def f(msg:String)(op:String => Unit),使其在调用函数字面量时能使用花括号,最后的println(_)也可以替换为 t => println(t),其中t为参数可任意命名;
12、传名参数应用
作用:在匿名函数基础上为函数命名;
例:
scala> def f(op:() => Boolean){
| if (op())
| println("OK")
| else
| println("ERROR")
| }
f: (op: () => Boolean)Unit
scala> f(() => 5>3)
OK
- def f(op:() => Boolean)可转换为def f(op: => Boolean)并在在调用时可简化为f(5>3)即可;
- def f(op:() => Boolean)与def f(op:Boolean)的区别,op:() => Boolean表示一个函数字面量,而op:Boolean表示参数Boolean两者有本质上的区别;
转载于:https://www.cnblogs.com/jianyuan/p/4257785.html
Scala学习笔记(二)表达式和函数相关推荐
- Webbench学习笔记二:getopt_long函数和build_request函数
目录 概述 1. main函数结构 2.getopt_long函数 2.1. 函数调用的几个参数 2.1.1. argc 2.1.2. argv 2.1.3. optstring 2.1.4. lon ...
- ES6学习笔记二arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- Scala学习笔记(三)
Scala学习笔记(三) 一.模式匹配 1. 简单模式匹配 2. 匹配类型 3. 守卫 4. 匹配样例类 5. 匹配数组 6. 匹配列表 7. 匹配元组 8. 变量声明中的模式匹配 8.1 获取数组中 ...
- Scala学习笔记(一)
Scala学习笔记(一) 一.Scala简介 二.Scala安装与配置 1. 安装JDK 2. 安装Scala SDK 3. 安装IDEA插件 三.Scala解释器 1. 启动Scala解释器 2. ...
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
- 吴恩达《机器学习》学习笔记二——单变量线性回归
吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...
- pythonsze_python学习笔记二 数据类型(基础篇)
Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...
- Mongodb使用学习笔记(二)
文章目录 Mongodb使用学习笔记(二)之查询篇 1. MongoDB命令学习 (1) MongoDB 查询文档 1.1 全部查询 1.2 单条件查询 1.3 多条件查询 1.3.1 AND拼接多条 ...
- python 内置函数转list_python学习笔记11-python内置函数
python学习笔记11-python内置函数 一.查看python的函数介绍: 二.python内置函数 1.abs获取绝对值: 通过python官网查看absabs(x) Return the a ...
最新文章
- Notes-stringr-part2
- 一些.net命令行工具的使用
- 概率统计:第七章 参数估计
- io流文本文档的快速读取
- SQL 关于地图两个坐标点之间的距离运算
- 如何清理不必要的事件日志分类
- QQ浏览器怎么设置为默认浏览器
- 呕心沥血干完K-Means聚类——深度AI科普团队
- SSM房产中介管理系统
- Android怎么改图标都不生效安卓开发如何修改APP图标和名字
- 小米4c一直显示无服务器,小米路由器4C不能上网(连不上网)怎么办?
- jpg格式图片怎么压缩?jpg图片如何压缩到最小?
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口
- 读《反脆弱性》:凹凸性资料搜集
- 有关STP测试的小实验
- 痛,然后“快乐”,谢谢你,我的2016
- 解决GitHub报错You‘re using an RSA key with SHA-1, which is no longer allowed. Please use a newer client
- vue admin 动态路由权限管理
- python客户端开发自行车租赁系统_Python实战—自行车租赁数据分析
- 新能源汽车高压配电管理(PDU/BDU)
热门文章
- Ubuntu进入pycharm创建的虚拟环境的方法(以及如果你安装了anaconda等其它修改了环境变量的东西该怎么进)
- 由一维数组创建小根堆
- bzoj 1263: [SCOI2006]整数划分
- [Python] zip() 函数
- 吴恩达神经网络和深度学习-学习笔记-9-mini-batch梯度下降法
- jQuery Mobile中网格grid样式ui-grid-*
- Echarts数据可视化series-pie饼图,开发全解+完美注释
- Java将excel文件转成json文件(有错误)
- AD19原理图背景栅格去掉(改为纯色)
- PHP对内存的运行,在PHP中运行密集的批处理过程,并避免内存耗尽