Scala学习二——控制结构和函数
一.if表达式有值
val s=if(x>0) 1 else -1,相当于Java中x>0?1:-1(不过不拿呢个在?:中插入语句),而且Scala中可以用混合类型(如if (x>0) "Hello" else -1)。
注:像 if(x>0) 1这样if语句可能没有输出值,但是在Scala中每个表达式都有值(此时是引入了一个Unit类,写做()[表示“无有用值”的占位符]。
REPL中想换行用{},想粘贴输入paste进入粘贴模式,然后Ctrl+D退出。
二.块也有值——是它最后一个表达式的值
块语句是一个包含{}的语句序列,包含一系列表达式,其结果也是一个表达式,块的值是块中最后一个表达式的值。[可以利用中间值分多步完成结果],一个以赋值语句结束的块的值是Unit类型的。
三.Scala的for循环(像增强版的Java for循环)
while和Java一样,for循环为for(i <- 表达式)其中<-会让i遍历右边的表达式中的所有值,如(for(i <- 1 to n) r=r*i会遍历1到n),遍历字符串或者数组时使用util方法如下:
val s="Hello"
var sum=0
for (i<- 0 util s.length) //i的最后一个取值为是s.length-1
sum+=s(i)
注:Scala中没有像Java中提供break和continue退出循环,可以使用Boolean值控制变量;使用嵌套函数——从函数中return;使用Breaks对象中的break方法(较慢)。
for循环高级特性:
1.以变量<-表达式提供多个生成器,如:

2.每个生成器带一个判断,以if开头的Boolean表达式:

3.使用任意多的定义,引入可以在循环中使用的变量:

4.for推导式:

四.分号(在绝大多数情况下不是必须的)
只有在同一行中写下多个语句需要用分号隔开,其他只要上下文能够明确的判断出哪里是语句的终止都不需要分号。
五.void类型是Unit
Unit是Scala引入的一个类写作()表示无用值,喜爱嗯当与void
六.避免在函数定义中使用return
Scala函数定义:给出函数名称,参数,函数体,如(def abs(x:Double)=if(x>=0) x else -x),必须给出所有参数类型,只要函数不是递归的就不用给出返回类型。
Scala中会使用大量的匿名函数,这些函数中return并不返回值给调用者,return一般当作函数版的break语句。
默认参数(调用函数时并不显示给出所有参数值),如def decorate(str:String,left:String="[",right="]")=left+str+right,left和right就有默认值
带名参数(顺序可不一致,让函数更可读),如decorate(left="[",str="haha",right="]")
变长参数(接受可变长度参数列表):
注:当作参数序列1 to 10:_*(val s=sum(1 to 5:_*))
def sum(args:Int*)={
var result=0
for(arg<-args) result+=arg
result
}
七.避免在函数式定义漏掉=
如果函数体包含花括号但没有前面的=号(def box(s:String){........}),那么返回类型为Unit,这样的函数称为过程,最好显示的声明def box(s:String):Unit={......}。
那么函数就更要注意不要把=漏掉了。
八.懒值
当val被声明为lazy时,它的初始化将被推迟,直到对它首次取值(对于开销较大的初始化语句而言非常有用),还可以应对循环依赖等问题,懒值介于val和def之间。
注:懒值也会有额外的开销,每次访问懒值时,都会有一个方法被调用,而这个方法以线程安全的方式检查该值是否已经初始化。
九.异常的工作方式和Java,C++一样(区别在catch语句中使用“模式匹配”)
和Java一样,抛出的对象必须是java.lang.Throwable的子类(区别:Scala没有“受检”异常——不需要声明函数或者方法可能会抛出某种异常)。
“受检”异常:在编译期被检查,比如可能会抛出IOException,就必须声明,这要求程序员必须去想在哪儿处理这些异常(很不错的目标),但是可能导致过早的捕获异常,或者超通用的异常类。
try{...}catch{...}finally{...}如:
try{
process(new URL("http://....."))
}
catch{
//不需要使用捕获的异常对象,可以使用_来替代变量名
case _:MainformedURLException=>println("Bad Url"+url)
case ex:IOException=>ex.printStatckTrace()
}
注: 
十.练习

1.
def signum(num:Int)={
if(num>0) 1
else if(num<0) -1
else 0
}

2.可知空的{}的类型是Unit,返回值是()

3.注意:在Scala中,赋值语句是Unit类型,所以只要给x赋值为Unit类型就行

4.
for(i <- 0 to 10 reverse )
print(i+"\t")
5.
def countdown(n:Int){
(0 to n reverse) map print
}
6.
var t:Long=1
for(ch <- "Hello"){
t=t*ch
}
7.
var t:Long=1 "Hello".foreach(t*=_)
8.
def product(str:String):Long={
var t:Long=1
str.foreach(t*=_)
t
}
9.
def product(str:String):Long={
if(str.length==1)
str.charAt(0).toLong
else
str.charAt(0)*product(str.drop(1))
}
10.
def xn(x : Double ; n : Int) : Double={
if (n==0)
1
else if (n <0)
1/xn(x,-n)
else if (n%2==0)
xn(x,n/2)* xn(x,n/2)
else
x*xn(x,n-1)
}
Scala学习二——控制结构和函数的更多相关文章
- Scala学习(二)--- 控制结构和函数
控制结构和函数 摘要: 本篇主要学习在Scala中使用条件表达式.循环和函数,你会看到Scala和其他编程语言之间一个根本性的差异.在Java或C++中,我们把表达式(比如3+4)和语句(比如if语句 ...
- Scala学习(二)练习
Scala控制结构和函数&练习 1. 一个数字如果为正数,则它的signum为1:如果是负数,则signum为-1:如果为0,则signum为0:编写一个函数来计算这个值 简单逻辑判断: 测试 ...
- scala学习笔记(7):函数(1)
函数是Scala的第一公民! 1 基本定义 scala> def max(x: Int, y: Int): Int = { if (x > y) x else y } 跟着是括号里带有冒 ...
- Scala学习二十二——定界延续
一.本章要点 延续让你可以回到程序执行当中之前的某个点; 可以在shift块中捕获延续 延续函数一直延展到包含它的reset块的尾部 延续所谓的”余下的运算“,从包含shift的表达式开始,到包含它的 ...
- Scala学习二十一——隐式转换和隐式参数
一.本章要点 隐式转换用于类型之间的转换 必须引入隐式转换,并确保它们可以以单个标识符的形式出现在当前作用域 隐式参数列表会要求指定类型的对象.它们可以从当前作用域中以单个标识符定义的隐式对象的获取, ...
- Scala学习二十——Actor
一.本章要点 每个actor都要扩展Actor类并提供act方法 要往actor发送消息,可以用actor!message 消息发送是异步的:”发完就忘“ 要接受消息,actor可以调用receive ...
- scala学习笔记:理解函数
定义一个函数: scala> def foo(x:Int)=x*2 foo: (x: Int)Int 可以采用匿名参数: scala> def foo:((Int)=>Int) = ...
- 【scala】2.控制结构和函数
简介 在Java或者C++中,我们把表达式和语句看做两种不同的东西.表达式有值,而语句执行动作. 在Scala中,几乎所有构造出来的语法结构都是有值的.这个特性使得程序更加的精简,也更易读. 1.条件 ...
- scala 学习笔记四 匿名函数
1.介绍 Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体. 使用匿名函数后,我们的代码变得更简洁了. 下面的表达式就定义了一个接受一个Int类型输入参数的匿名函数: var ...
随机推荐
- zookeeper系列(五)zookeeper在大型分布式系统中的应用
作者:leesf 掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6063694.html 尊重原创感谢博主公开这么好的博文, ...
- springboot的@EnableAutoConfiguration起作用的原理
通常我们启动一个springboot项目会在启动方法中增加@SpringBootApplicatoin注解,该注解中包含了@EnableAutoConfiguration @Target(Elemen ...
- VLC和Qt结合编写流媒体rtsp播放器
VLC播放器是一款功能强大且小巧的播放器,它支持多种多样的音视频格式,比如MPEG1,2以及mp3等等.并且通过Qt和VLC的结合能让每个开发者写出自己的视频流媒体播放器. Q ...
- tomcat8踩坑:url包含|等特殊字符报错400的问题
这个问题纠缠了我很久了,终于在今天早上解决了,感谢自己的不放弃和不断尝试的决心,我坚信,我可以找到解决方式!! 项目用的spring boot+spring security框架,关于统一错误页面在开 ...
- [go]unsafe.Sizeof浅析
sizeof 如果x为一个切片,sizeof返回的大小是切片的描述符,而不是切片所指向的内存的大小. 那么这里如果换成一个数组呢?而不是一个切片 arr := [...]int{1,2,3,4,5} ...
- 转: Android 设备的远程调试入门
从 Windows.Mac 或 Linux 计算机远程调试 Android 设备上的实时内容. 本教程将向您展示如何: 设置您的 Android 设备进行远程调试,并从开发计算机上发现设备. 从您的开 ...
- linux常用命令(16)locate命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...
- UFIDA
充分匹配了‘用友’的中文品牌的含义,即‘与用户真诚合作,做用户可靠朋友’.其中‘U’代表‘User’,即用户:‘FID’表示忠诚.信任,来源于 Fidelity(诚实)等英文词的词根:助音词‘A’放在 ...
- Linux增加虚拟内存方法
例如增加2G虚拟内存,操作如下: [root@gamedb ~]# free -m[root@gamedb tmp]# dd if=/dev/zero of=/tmp/big_swap bs=1024 ...
- 【POJ - 3984】迷宫问题(dfs)
-->迷宫问题 Descriptions: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0 ...