1. 实验室名称:
大数据实验教学系统
2. 实验项目名称:
Scala语言基础
3. 实验学时:
4. 实验原理:
1、Scala 变量
变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。
基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数,小数或者字母。
在学习如何声明变量与常量之前,我们先来了解一些变量与常量。
• 一、变量:在程序运行过程中其值可能发生改变的量叫做变量。如:时间,年龄。
• 二、常量 在程序运行过程中其值不会发生变化的量叫做常量。如:数值 3,字符’A’。
2、Scala流程控制
Scala IF…ELSE 语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。
可以通过下图来简单了解条件语句的执行过程:
有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。
编程语言提供了更为复杂执行路径的多种控制结构。
循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图:
3、Scala集合
Scala提供了一套很好的集合实现,提供了一些集合类型的抽象。
Scala 集合分为可变的和不可变的集合。
可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。
而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。
4、Scala异常处理
Scala 的异常处理和其它语言比如 Java 类似。
Scala 的方法可以通过抛出异常的方法的方式来终止相关代码的运行,不必通过返回值。
5. 实验目的:
掌握Scala基本语法(变量、表达式、流程控制)
掌握Scala函数定义和参数传递(位置参数、默认参数、名称参数等)
掌握Scala常用集合数据结构(数组、列表、元组、Map等)
掌握Scala异常处理
6. 实验内容:
1、学会使用Scala基本语法,包含变量、表达式、流程控制等。
2、学会使用Scala定义函数定义和传递参数,包括位置参数、默认参数、名称参数等。
3、学会使用Scala常用集合数据结构,包括数组、列表、元组、Map等。
4、学会使用Scala进行异常处理。
7. 实验器材(设备、虚拟机名称):
硬件:x86_64 ubuntu 16.04服务器
软件:JDK 1.8,Scala-2.11.x
8. 实验步骤:
8.1 启动Scala Shell
在终端中,执行以下命令,启动scala shell:
1. $ scala
8.2 Scala基本语法
1、变量。
在 Scala 中,使用关键词 “var” 声明变量,使用关键词 “val” 声明常量。
在paste模式下,声明变量并修改变量:
1. var myVar : String = "Foo" 2. myVar = "New Foo"
按下Ctrl+D,执行以上代码。输出结果如下:
myVar: String = New Foo myVar: String = New Foo
在paste模式下,声明常量并修改常量:
1. val myVal : String = "Smart" 2. myVal = "New Smart"
按下Ctrl+D,执行以上代码。输出结果如下:
:12: error: reassignment to val myVal = “New Smart” ^
在上面的代码中定义了常量 myVal,它是不能修改的。如果程序尝试修改常量 myVal 的值,程序将会在编译时报错。
使用lazy关键字可实现惰性求值特性,这允许用户延迟任何表达式的执行。当使用lazy关键字声明表达式时,它只会在显式调用时执行:
1. val x = 3 2. val y = 5 3. lazy val sum = y - x 4. println(sum)
按下Ctrl+D,执行以上代码。输出结果如下:
2 x: Int = 3 y: Int = 5 sum: Int = <lazy>
对于lazy变量,只有在调用它时才计算它。需要注意的是,惰性计算特性只能在val中使用。
2、变量数据类型推断
在 Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。
所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则将会报错。
1. var myVar = 10; 2. val myVal = "Hello, Scala!";
按下Ctrl+D,执行以上代码。输出结果如下:
myVar: Int = 10 myVar: String = Hello, Scala!
以上代码中,变量myVar会被推断为 Int 类型,myVal 会被推断为 String 类型。
3、Scala 多个变量声明。
Scala 支持多个变量的声明:
1. val xmax, ymax = 100 // 变量xmax, ymax都赋值为100
按下Ctrl+D,执行以上代码。输出结果如下:
xmax: Int = 100 ymax: Int = 100
4、Scala表达式。
在Scala中, 一切皆可视为表达式:
Scala 中还可以使用多行表达式,使用花括号{} 包含。 多行表达式的最后一行语句执行的结果即为整个多行表达式的结果。例如,在paste模式下,键入以下代码:
1. var diff_salary = { 2. var salary_PHP = 15000 3. var salary_SCALA = 25000 4. salary_SCALA - salary_PHP 5. }
按下Ctrl+D,执行以上代码。输出结果如下:
diff_salary: Int = 10000
5、Scala流程控制。
• if语句。
if语句语句由布尔表达式及之后的语句块组成。
如果布尔表达式为 true 则执行大括号内的语句块,否则跳过大括号内的语句块,执行大括号之后的语句块。
在paste模式下,键入以下内容:
1. var x = 10; 2. 3. if( x < 20 ){ 4. println("x < 20"); 5. }
按下Ctrl+D,执行以上代码。输出结果如下:
x < 20 x: Int = 10
• if…else 语句。
if 语句后可以紧跟 else 语句,else 内的语句块可以在布尔表达式为 false 的时候执行。
在paste模式下,键入以下内容:
1. var x = 30; 2. 3. if( x < 20 ){ 4. println("x 小于 20"); 5. }else{ 6. println("x 大于 20"); 7. }
按下Ctrl+D,执行以上代码。输出结果如下:
x 大于 20 x: Int = 30
• if…else if…else 语句。
if 语句后可以紧跟 else if…else 语句,在多个条件判断语句的情况下很有用。
在paste模式下,键入以下内容:
1. var x = 30; 2. 3. if( x == 10 ){ 4. println("X 的值为 10"); 5. }else if( x == 20 ){ 6. println("X 的值为 20"); 7. }else if( x == 30 ){ 8. println("X 的值为 30"); 9. }else{ 10. println("无法判断 X 的值"); 11. }
按下Ctrl+D,执行以上代码。输出结果如下:
X 的值为 30
x: Int = 30
• if…else 嵌套语句。
if…else 嵌套语句可以实现在 if 语句内嵌入一个或多个 if 语句。
在paste模式下,键入以下内容:
1. var x = 30; 2. var y = 10; 3. 4. if( x == 30 ){ 5. if( y == 10 ){ 6. println("X = 30 , Y = 10"); 7. } 8. }
按下Ctrl+D,执行以上代码。输出结果如下:
X = 30 , Y = 10 x: Int = 30 y: Int = 10
while 循环
Scala 的 while 循环和其它语言如 Java 功能一样,它含有一个条件,和一个循环体,只有条件满足,就一直执行循环体的代码。
在paste模式下,键入以下内容:
1. var a=0 2. while( a<5) { 3. println(a) 4. a = a + 1 5. }
按下Ctrl+D,执行以上代码。输出结果如下:
0 1 2 3 4 a: Int = 5
• do…while 循环。
Scala 也有 do-while 循环,它和 while 循环类似,只是检查条件是否满足在循环体执行之后检查。
在paste模式下,键入以下内容:
1. var a=0 2. do{ 3. a = a + 1 4. println(a) 5. } while( a<5)
按下Ctrl+D,执行以上代码。输出结果如下:
1 2 3 4 5 a: Int = 5
• for 循环
Scala 中的 for 表达式有如一把完成迭代任务的瑞士军刀,它允许你使用一些简单的部件以不同的方法组合可以完成许多复杂的迭代任务。简单的应用比如枚举一个整数列表,较复杂的应用可以同时枚举多个不同类型的列表,根据条件过滤元素,并可以生成新的集合。
在paste模式下,键入以下内容:
1. for (i <- 1 to 5) println(i)
在上面语句中,i不需要提前进行变量声明,可以在for语句括号中的表达式中直接使用。语句中,“<-”表示,之前的i要遍历后面1到5的所有值。结果:
1 2 3 4 5
• 注意to和until的区别:
在paste模式下,键入以下内容:
1. for( a <- 1 until 5){ 2. println(a); 3. }
按下Ctrl+D,执行以上代码。输出结果如下:
1 2 3 4
在for循环中可以使用分号 (;) 来设置多个区间,它将迭代给定区间所有的可能值。
在paste模式下,键入以下内容:
1. for( a <- 1 to 3; b <- 1 to 3){ 2. print( "a = " + a ) 3. println( ", b = " + b ) 4. }
按下Ctrl+D,执行以上代码。输出结果如下:
a = 1, b = 1 a = 1, b = 2 a = 1, b = 3 a = 2, b = 1 a = 2, b = 2 a = 2, b = 3 a = 3, b = 1 a = 3, b = 2 a = 3, b = 3
• Scala并没有提供break或continue语句来退出循环。那么如果需要break时我们该怎么做呢?
在paste模式下,键入以下内容:
1. import scala.util.control.Breaks._ 2. 3. var n = 15 4. breakable { 5. for(c <- "12345678910") { 6. if(n == 10) { 7. println() 8. break 9. } else { 10. print(c) 11. } 12. n -= 1 13. } 14. }
按下Ctrl+D,执行以上代码。输出结果如下:
12345 import scala.util.control.Breaks._ n: Int = 10
6. 简单模式匹配。
一个模式匹配的简单应用是作为多级if-else 语句的替代,这可以提高代码的可读性。模式匹配不使用关键字switch,Scala 使用关键字match。每个可能的匹配由关键字case 处理。如果有一个case 被匹配到,那么右箭头右侧的代码被执行。其中下划线_代表默认case。如果前面没有一个case匹配上的话,默认case 的代码会被执行。与switch 语句不同,在每个case 后的代码不需要break 语句。只有匹配的case 会被执行。另外,每个=>右侧的代码是一个表达式,返回一个值。因此,一个模式匹配语句本身是一个表达式,返回一个值。
在paste模式下,键入以下内容:
1. val math = 3 2. val simple = math match{ 3. case 1 => "西普" 4. case 2 => "其他" 5. case _ => "不正确" 6. } 7. println(simple)
按下Ctrl+D,执行以上代码。输出结果如下:
不正确 math: Int = 3 simple: String = 不正确