笔记的整理主要针对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学习笔记(二)表达式和函数相关推荐

  1. 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 ...

  2. ES6学习笔记二arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  3. Scala学习笔记(三)

    Scala学习笔记(三) 一.模式匹配 1. 简单模式匹配 2. 匹配类型 3. 守卫 4. 匹配样例类 5. 匹配数组 6. 匹配列表 7. 匹配元组 8. 变量声明中的模式匹配 8.1 获取数组中 ...

  4. Scala学习笔记(一)

    Scala学习笔记(一) 一.Scala简介 二.Scala安装与配置 1. 安装JDK 2. 安装Scala SDK 3. 安装IDEA插件 三.Scala解释器 1. 启动Scala解释器 2. ...

  5. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  6. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  7. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  8. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

  9. Mongodb使用学习笔记(二)

    文章目录 Mongodb使用学习笔记(二)之查询篇 1. MongoDB命令学习 (1) MongoDB 查询文档 1.1 全部查询 1.2 单条件查询 1.3 多条件查询 1.3.1 AND拼接多条 ...

  10. python 内置函数转list_python学习笔记11-python内置函数

    python学习笔记11-python内置函数 一.查看python的函数介绍: 二.python内置函数 1.abs获取绝对值: 通过python官网查看absabs(x) Return the a ...

最新文章

  1. Notes-stringr-part2
  2. 一些.net命令行工具的使用
  3. 概率统计:第七章 参数估计
  4. io流文本文档的快速读取
  5. SQL 关于地图两个坐标点之间的距离运算
  6. 如何清理不必要的事件日志分类
  7. QQ浏览器怎么设置为默认浏览器
  8. 呕心沥血干完K-Means聚类——深度AI科普团队
  9. SSM房产中介管理系统
  10. Android怎么改图标都不生效安卓开发如何修改APP图标和名字
  11. 小米4c一直显示无服务器,小米路由器4C不能上网(连不上网)怎么办?
  12. jpg格式图片怎么压缩?jpg图片如何压缩到最小?
  13. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口
  14. 读《反脆弱性》:凹凸性资料搜集
  15. 有关STP测试的小实验
  16. 痛,然后“快乐”,谢谢你,我的2016
  17. 解决GitHub报错You‘re using an RSA key with SHA-1, which is no longer allowed. Please use a newer client
  18. vue admin 动态路由权限管理
  19. python客户端开发自行车租赁系统_Python实战—自行车租赁数据分析
  20. 新能源汽车高压配电管理(PDU/BDU)

热门文章

  1. Ubuntu进入pycharm创建的虚拟环境的方法(以及如果你安装了anaconda等其它修改了环境变量的东西该怎么进)
  2. 由一维数组创建小根堆
  3. bzoj 1263: [SCOI2006]整数划分
  4. [Python] zip() 函数
  5. 吴恩达神经网络和深度学习-学习笔记-9-mini-batch梯度下降法
  6. jQuery Mobile中网格grid样式ui-grid-*
  7. Echarts数据可视化series-pie饼图,开发全解+完美注释
  8. Java将excel文件转成json文件(有错误)
  9. AD19原理图背景栅格去掉(改为纯色)
  10. PHP对内存的运行,在PHP中运行密集的批处理过程,并避免内存耗尽