笔记的整理主要针对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两者有本质上的区别;

Scala学习笔记(二)表达式和函数的更多相关文章

  1. scala 学习笔记二 方法与函数

    1.介绍 Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法. Scala 中的方法跟 Java 的 ...

  2. Scala学习十二——高阶函数

    一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...

  3. Scala学习笔记(3)-表达式归纳

    语法:使用表达式定义值和变量 val <identifier>[:<type>]=<expression>  字面值类型 var <identifier> ...

  4. [Scala]Scala学习笔记二 数组

    1. 定长数组 如果你需要一个长度不变的数组,可以使用Scala中的Array. val nums = new Array[Int](10) // 10个整数的数组 所有元素初始化为0 val str ...

  5. python学习笔记二:(python3 logging函数中format说明)

    背景,在学习logging时总是遇到无法理解的问题,总结,尝试一下更清晰明了了,让我们开始吧! logging模块常用format格式说明 %(levelno)s: 打印日志级别的数值 %(level ...

  6. scala学习笔记:高阶函数

    scala> def power(y:Double)=(x:Double)=>Math.pow(x,y) warning: there were 1 deprecation warning ...

  7. 学习笔记二十三——字符函数库cctype【转】

    本文转载自: 字符函数库cctype 在头文件cctype(ctype.h)中定义了一些函数原型,可以简化输入确定字符是否为大写字母.数字.标点符号等工作. 例如: 如果ch是一个字母,则isalph ...

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

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

  9. python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法

    python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...

  10. Lamda表达式学习笔记二

    Lamda表达式学习笔记二 lamda表达式----方法引用 上一篇讲到Lamda体就是对函数式接口方法的实现 ,在方法体中我们可能会引用其他方法实现逻辑,所以在lamda体中我们可以直接引用器方法 ...

随机推荐

  1. STL set_difference set_intersection set_union 操作

    以下是STL algorithm的几个函数,使用的条件是有序容器,所以 vector在被sort了之后是可以使用的,set也是可以使用的. set_difference 这个是求得在第一个容器中有,第 ...

  2. Linux df 命令

    Linux df 命令 df(disk free)功能说明:显示磁盘的相关信息.语 法:df [-ahHiklmPT][--block-size=<区块大小>][-t <文件系统类型 ...

  3. 《暗黑世界》安卓APK 编译流程详细说明教程!(图文)

    原地址:http://bbs.gameres.com/forum.php?mod=viewthread&tid=223671 关于开发环境的搭建,之前的相关文档已经很详细的说明,对环境的搭建请 ...

  4. PYTHON的CGIServer的进化

    按例程,一步一步理解如何从SOCKET,TCP,HTTP,CGIHTTP进化的. 最终,静态文件和脚本分享,且能处理FORM提交和展示. 下一步,到数据库??:) A,SOCKET #HTTPserv ...

  5. php smarty 缓存和配置文件的基本使用方法

    smarty高级部分包括缓存机制和配置文件的调用 下面是代码实现: 文件一,配置文件: #全局变量 title="网站主页" content="一个网站的主体部分&quo ...

  6. M-JPEG和MPEG-4的区别 M-JPEG VS MPEG

    http://blog.sina.com.cn/s/blog_4b357b300100gre9.html M-JPEG VS MPEG http://blog.csdn.net/bluesky_sun ...

  7. php stdClass Object 问题

    Array ( [0] => stdClass Object ( [term_id] => 3 [name] => apache [slug] => apache [term_ ...

  8. jstring 和char 之间的转换方法

    //jstring to char* char* jstringTostring(JNIEnv* env, jstring jstr) { char* rtn = NULL; jclass clsst ...

  9. Import Items – Validation Multiple Languages Description

            ð  提交标准请求创建和更新物料,因语言环境与处理次序方式等因素,造成物料中英(更多语言)描述和长描述混乱刷新. 症状: >>> Submit Standard Op ...

  10. windows 下 使用codeblocks 实现C语言对python的扩展

    本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展 ...