Scala的控制结构和函数
控制结构和函数
先看以下简单的一个条件表达式的demo
object TestConditional {
def main(args: Array[String]): Unit = {
// scala的if判断表达式
var x = 1
if (x > 0) x = 10 else x = 20
println(x)
}
}
Scala的if/else语法结构与java一样,如以上代码一样,需要注意的是当else部分缺失了比如:if(x>0) 1,这个if语句没有输出值,但是在Scala中,每个表达式都应该有值,这个问题可以引入一个Unit类,写做()。不带else的这个if语句等同于 if (x>0) 1 else () Scala中没有switch语句,只需if即可解决所有。
- 语句终止
在java和C++中,每一个语句都以分号结束,而在Scala中和JavaScript类似--行尾的位置不需要分号,因为Scala编译器能够从上下文明确判断出是语句的终止,但是若要在单行中写下多个语句,需要用分号隔开,例如下面的表达式需要分号隔开
if (n > 0) {r = r * n; n-=1}
若是在写较长的语句,需要两行来写,需要告诉编译器不是语句结尾,例子如下:
x = y + (v - m) * d + // +告诉编译器不是结尾
0.5 * (c - v) * t
- 块表达式和赋值
在java中,块语句是一个包含与{}中的语句序列,在Scala中{}包含一系列表达式,在Scala中,赋值动作本身没有值,它们是Unit类型,相当于java中的void,而这个类型只有一个值,写做()
{r = r * n; n-=1}
- 输入和输出
打印一个值可以使用print或者println函数,
例如: println("x="+"10"),另外还有一个带有C风格格式化的字符串printf函数例如:
printf("hello, %S! welcome to Scala world.\n","michael")
也可以使用readLine函数从控制台读取一行输入,读取数字,Boolean或者是字符,可以永readInt,readDouble,readByte,readShort,readLong,readFloat,readBoolean或者readChar。
// 使用readLine
val name=readLine("your name:")
print("your age")
val age = readInt()
printf("hello,%s! you have %d year work experience",name,age)
- 循环
Scala中没有与for(初始化变量值;变量布尔表达式;变量更新),Scala中有两个选择:一个是使用while循环,而是使用以下for语句
for (i<- 表达式)让变量i遍历<-右边的表达式的所有值,对于Scala集合比如Range而言,会取到集合中的每个值
Scala中没有提供break或者continue语句退出循环,一般可以有以下三种方法跳出循环:
1. 使用Boolean型的控制变量
2. 使用嵌套函数---使用return
3. 使用breaks对象中的break方法
import scala.util.control.Breaks._
breakable {
for(...) {
// 退出循环
if(...) break;
}
}
- for循环推导式
Scala中的for循环比java要丰富的多,下面介绍其高级特性
// 多个生成器
for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j) + " ")
println()
// 守卫生成器,if前没有分号
for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ")
// 可以定义变量,在循环中引入
println()
for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + " ")
for循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。Scala中for循环是有返回值的。如果被循环的是Map,返回的就是Map,被循环的是List,返回的就是List,以此类推。
scala> for (i <- 1 to 5) yield i
res10: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)
- 函数
Scala中定义函数需要定义函数的名称、参数和函数体
def abs (x: Double) = if (x >= 0) x else -x
必须给出所有参数的类型,只要不是递归就不需指定返回类型。Scala会自动通过=符号右侧的表达式的类型推断出返回类型
// 递归函数,必须指定返回类型
def fac(n : Int) :Int = if (n<=0) 1 else n* fac(n -1)
- 默认参数和带名参数
/**
* 我们在调用某些函数无需显示给出所有的参数值,可以初始化给出默认值
*/
def haha(str:String,left:String="[",right:String="]") = left + str +right
- 可变参数
// 传入的参数是单个参数
def sum(args : Int*):Int = {
var result = 0
for (arg <- args) result += arg
// 返回result
result
}
// 计算1+2的值
val s1 = sum(1, 2)
// 用法是错误的,因为1 to 3 是一个整数区间不是单个整数
val s3 = sum (1 to 3)
// 计算1+2+3的值(解决区间问题)
val s2 = sum(1 to 3: _*)
- 异常处理
Scala异常的工作机制和java或C++一样,当你抛出异常时:
throw new IllegalArgumentException("description for exception")
和java一样,抛出的对象必须是java.lang.Throwable的子类,不过没有编译时候的检查异常
try {
process(new URL("http:wwww.baidu.com"))
} catch {
// 自定义异常描述
case _:URLException => println("bad url")
// 使用默认异常信息
case ex: IOException => ex.printStackTrace()
}
使用try finally语句:
var in = new URL("http:www.baidu.com").openStream()
try {
process(in)
} finally {
in.close()
}
Scala的控制结构和函数的更多相关文章
- 《快学Scala》——控制结构和函数
条件表达式 在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值.例如: if (x > 0) 1 else -1 上述表达式的值是1或-1,具体是哪一个取决于x ...
- Scala学习(二)--- 控制结构和函数
控制结构和函数 摘要: 本篇主要学习在Scala中使用条件表达式.循环和函数,你会看到Scala和其他编程语言之间一个根本性的差异.在Java或C++中,我们把表达式(比如3+4)和语句(比如if语句 ...
- 2.scala控制结构、函数、异常处理
2.scala控制结构.函数.异常处理---小书匠,在线编辑器,MARKDOWN,Evernote,文件版本 a:focus { outline: thin dotted #333; outline: ...
- Scala 流程空间,函数,异常处理
1,)首先留意一下下边的代码块,他是怎么运行的,貌似在c#中他是出错的,不应该出现这样的写法的,但在scala中侧不然: package com.dt.study /** * The package ...
- 快学Scala-第二章 控制结构和函数
知识点: 1.条件表达式 if(x>0) 1 else 0 scala每个表达式都有一个类型,如果一致则为它们的类型,如果为混合类型表达式,则为它们的公共超类型Any. if(x>0) 1 ...
- Thinking in scala (6)----高阶函数----返回一个函数
在Thinking in scala (5)----高阶函数* 里面,我们演示了如何把一个函数作为参数传递给另外一个函数. 在本文里面,我们来演示函数式编程另外一个重要的特性:返回一个函数.首先来看这 ...
- Thinking in scala (5)----高阶函数*
高阶函数是函数式编程里面一个非常重要的特色,所谓的高阶函数,就是以其它函数作为参数的函数. 下面以一个小例子演示Scala的高阶函数特性,非常有意思,也非常强大. 首先看这么一个程序: code1: ...
- 【scala】2.控制结构和函数
简介 在Java或者C++中,我们把表达式和语句看做两种不同的东西.表达式有值,而语句执行动作. 在Scala中,几乎所有构造出来的语法结构都是有值的.这个特性使得程序更加的精简,也更易读. 1.条件 ...
- Scala具体解释---------控制结构和函数
条件表达式: Scala的if else语法结构和Java的一样.只是,Scala的if else表达式有值.这个值就是跟在if或者else后面的表达式的值. 比如: if(x>0) 0 els ...
随机推荐
- 八、Web移动端Fixed布局的解决方案
移动端业务开发,iOS 下经常会有 fixed 元素和输入框(input 元素)同时存在的情况. 但是 fixed 元素在有软键盘唤起的情况下,会出现许多莫名其妙的问题. 这篇文章里就提供一个简单的有 ...
- 回归JavaScript基础(四)
主题:JavaScript变量.作用域和内存问题 JavaScript的变量和别的语言比起来是与众不同的.说道变量,不得不谈他的作用域.同很多语言一样,JavaScript开发者也不用担心开发中内存的 ...
- Software Project Management 2017 Homework 1
Recently, I have a project, I use Unity3D to finish a visualization work, which is the final project ...
- Apache服务器如何通过.htaccess文件设置防盗链?
Apache服务器通过.htaccess文件设置防盗链 用户经常面对的一个问题就是服务器的流量问题,而站点文件被盗链是其中最为主要的部分.所谓盗链,是指其他网站直接链接我们网站上的文件,一般来说,盗链 ...
- MySQL案例09:Last_IO_Error: Got fatal error 1236 from master when reading data from binary log
刚处理完“挖矿”事件,在做最后一个MySQL NBU备份的时候,发现从库有问题,好奇的是怎么主从状态异常没有告警呢?先不管这么多了,处理了这个问题再完善告警内容. 一.错误信息 从库show slav ...
- Excel截取特定字符后面的值
应该用到三个字符串函数:LEFT.RIGHT.MID 1.LEFT函数: 用法:LEFT(要提取字符所在单元格,从左侧开始提取的个数) 例如:=LEFT(A1,2) 意思是从A1单元格提取前两个字符. ...
- C++用法总结
1.C++的绝对值符号 如果是整形的,就是abs() 如果是浮点型的,是fabs() 这两个函数都从属于库函数math.h #include <cmath> or #include< ...
- (1)Set集合 (2)Map集合 (3)异常机制
1.Set集合(重点)1.1 基本概念 java.util.Set接口是Collection接口的子接口,与List接口平级. 该接口中的元素没有先后放入次序,并且不允许重复. 该接口的主要实现类:H ...
- ZT 二叉树的非递归遍历
ZT 二叉树的非递归遍历 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就 是递归定 ...
- java StringBuilder案例
实现输出字符串的长度,容量(容量不够则扩容),及内容 import java.util.Arrays; public class MyStringBuilderDemo { //任务:存储字符串并输出 ...