一、课程前导
DT大数据梦工厂的微信公众号是DT_Spark,每天都会有大数据实战视频发布,请您持续学习。
Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2
Scala是最为重要的大数据语言,该视频每天还在持续跟新中,预计大约有140讲,请您根据上述视频彻底掌握Scala实战技术。
酷6:http://v.ku6.com/show/cYNlmbVTl4xaMuevyq1kSQ...html?from=my
51cto:http://down.51cto.com/data/2074330
搜狐视频:http://my.tv.sohu.com/pl/9020529/80441056.shtml
土豆 http://www.tudou.com/programs/view/uyfijW3J0JA/
最后,王家林老师个人的微信是18610086859
二、课程内容
第2讲 Scala函数定义、流程控制、异常处理入门实战
1.函数
Scala除了方法外还支持函数。方法对于进行操作,函数不是。
要定义函数,你需要给出函数的名称、参数和函数体。语法如下:
def 函数名(值1:参数类型1) = 函数体
必须给出所有参数的类型。
只要函数不是递归的,就不需要指定返回类型。Scala编译器可以通过=符号右侧的表达式的类型推断出返回类型。
如果函数体需要多个表达式完成,可以用代码块。块中最后一个表达式的值就是函数的返回值。例如:
def fac(n : Int) = {
var i = 1
for(i <- 1 to n) r = r *i
r
}//r的值就是函数的值
在匿名函数中,return并不返回值给调用者,它只是跳出到包含它的带名函数中。可以把return当做是函数版的break语句,尽在需要时使用。
对于递归函数,必须指定返回类型。例如:
def fac(n : Int) : Int = if(n <= 0) 1 else n * fac(n - 1)
package com.scala.chapter02
object Hello {
def main(args : Array[String]) : Unit = {
println("Hello Scala!")
//doWhile
println(looper(100,298))
}
def doWhile(){
var line = ""
do{
line = readLine()
println("Read:" + line)
}while(line != "")
}
def looper(x : Long, y : Long) : Long = {
var a = x //100
var b = y //298
while(a != 0){
val temp = a //100 98
a = b % a //98 = 298%100 100%98
b = temp //100 98
}
b
}
}
2.1条件表达式
在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值。你可以将if/else表达式的值赋值给变量:
val s = if(x > 0) 1 else -1
这与如下语句的效果一样:
if(x > 0) s = 1 else s = -1
不过,第一种写法更好,因为它可以用来初始化一个val。而在第二种写法当中,s必须是var。
Scala中的分号绝大多数情况下不上必需的。
Scala的if/else将在Java和C++中分开的两个语法结构if/else和?:结合在了一起。
在Scala中,每个表达式都有一个类型。如果一个表达式的类型不统一,它们的公共超类型叫做Any。
如果else部分缺失了,比如:
if(x > 0) 1
那么有可能if语句没有输出值。但是在Scala中,每个表达式都应该有某种值。这个问题的解决方案是引入Unit类,写作()。不带else的这个if语句等同于
if(x > 0)1 else ()
你可以把()当做是表示“无有用值”的占位符,将Unit当做Java或C++中的void。
说明:Scala没有switch语句,不过它有一个强大得多的模式匹配机制。
2.2语句终止
在Scala中,行尾的位置不需要分号。不过,如果你想在单行中写下多个语句,就需要将它们以分号隔开。
如果你在写较长的语句,需要分行来写的话,就要确保第一行以一个不能用语句结尾的符号结尾。
s = s0 + (v - v0) * t +//告诉解析器这里不是语句的末尾
0.5 * (a - a0) * t * t
2.3块表达式和赋值
在Scala中,{}块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。这个特性对于那种对某个val的初始化需要分多步完成的情况很有用。例如:
val distance = {val dx = x - x0;val dy = y - y0;sqrt(dx * dx + dy * dy)}
{}块的值取其最后一个表达式。
在Scala中,赋值动作本身是没有值的——或者,更严格地说,它们的值是Unit类型的,这个类型只有一个值,写作“()”。
由于赋值语句的值是Unit类型的,所以不能把一个Unit类型的值赋值给一个变量。
2.4输入和输出
如果要打印一个值,可以用print或println(最后换行),另外,还有一个带有C风格化字符串的printf函数。
可以用readLine函数从控制台读取一行输入。如果要读取数字、Boolean或者是字符,可以用readInt、readShort、readLong、readFloat、readDouble、readBoolean或者readChar。与其他方法不同,readLine带一个参数作为提示字符串。
readLine("Your name:")
readInt()
2.5循环
Scala拥有与Java和C++相同的while和do循环。
Scala没有与for(初始化变量;检查变量是否满足某条件;更新变更)循环直接对应的结构。如果你需要这样的循环,有两个选择:一是使用while循环,二是使用如下for语句:
for(i < -1 to n)//1 to n这个调用返回数字1到数字n(含)的Range(区间)。
r = r * i
遍历字符串或数组时,通常需要使用从0到n - 1的区间。你也可以用until方法而不是to方法,util方法返回一个并不包含上限的区间。
val s = "Hello"
var sum = 0
for(i <= 0 util s.length)
sum += s(i)
你也可以直接遍历对应的字符序列:
var sum = 0
for(ch <= "Hello") sum += ch
在Scala中,对循环的使用并不如其他语言那么频繁。可以通过对序列中所有值应用某个函数的方式来处理它们,而完成这项工作只需要一次方法调用即可。
说明:Scala并没有提供break或continue语句来推出循环。有如下几个选项实现break的作用:
1、使用Boolean型的控制变量。
2、使用嵌套函数——可以从函数当中return。
3、使用Breaks对象中的break方法。
2.6高级for循环和for推导式
Scala中的for循环比起Java和C++功能要丰富得多。
可以以变量<-表达式的形式提供多个生成器,用分号将它们隔开。例如:
for(i <- 1 to 3;j <- 1 to 3)print((10 * i + j) + " ")
//将打印11 12 13 21 22 23 31 32 33
每个生成器都可以带一个守卫,以if开头的Boolean表达式:
for(i <- 1 to 3;j <- 1 to 3 if i != j)print((10 * i + j)+ " " )
//将打印11 13 21 23 31 33
如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值:
for(i <- 1 to 10)yield i % 3
//生成Vecor(1,2,0,1,2,0,1,2,0,1)
这类循环叫做for推导式。
for推导式生成的集合与它的第一个生成器是类型兼容的。例如:
for(c <- "Hello";i <- 0 to 1)yield(c + i).toChar
//将生成"HIefmlmop"
说明:如果你愿意,你也可以将生成器、守卫和定义包含在花括号当中,并可以以换行的方式而不是分号来隔开它们:
for{ i <-
from = 4 - i;
j <- from to 3}
2.异常
Scala异常的工作机制和Java和C++一样。当抛出异常时,比如:
throw new IllegalArgumentException("x should not be negative")
当前的运算被中止,运行时系统查找可以接受IllegalArgumentException的异常处理器。控制权将在离抛出点最近的处理器中恢复。如果没有找到符合要求的异常处理器,则程序退出。
和Java一样,抛出的对象必须是java.lang.Throwable的子类。与Java不同的是,Scala没有“受检”异常——你不需要声明说函数或者方法可能会抛出某种异常。
throw表达式有特殊的类型Nothing。这在if/else表达式中很有用。如果一个分支的类型是Nothing,那么if/else表达式的类型就是另一个分支的类型。
捕获异常的语法采用的是模式匹配的语法,例如:
try{
process(new URL("http://horstmann.com/fred-tiny.gif"))
}catch{
case _:MalformedURLException => println("Bad URL:" + url)
case ex:IOException => ex.printStackTrace()
}
和Java或C++一样,更通用的异常应该排在更具体的异常之后。
如果不需要使用捕获的异常对象,可以使用“_”来替代变量名。
try/finally语句让你可以释放资源,不乱有没有异常发生。
注意,try/catch和try/finally的目的是互补的。try/catch语句处理异常,而try/finally语句在异常没有被处理时执行某种动作(通常是清理工作)。可以把它们结合在一起成为单个try/catch/finally语句:
try{...}catch{...}finally{...}
这和下面的语句一样:
try{try{...}catch{...}}finally{...}
object Exception {
def main(args : Array[String]){
val n = 99
try{
val half = if(n % 2 == 0)
n / 2
else new RuntimeException("N must be event")
}catch{
case e: Exception => println("The exception is :" + e.getMessage)
}finally{
}
}
}
DT大数据梦工厂的微信公众号是DT_Spark,每天都会有大数据实战视频发布,请您持续学习。
Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2
Scala是最为重要的大数据语言,该视频每天还在持续跟新中,预计大约有140讲,请您根据上述视频彻底掌握Scala实战技术。
酷6:http://v.ku6.com/show/cYNlmbVTl4xaMuevyq1kSQ...html?from=my
51cto:http://down.51cto.com/data/2074330
搜狐视频:http://my.tv.sohu.com/pl/9020529/80441056.shtml
土豆 http://www.tudou.com/programs/view/uyfijW3J0JA/
最后,王家林老师个人的微信是18610086859
二、课程内容
第2讲 Scala函数定义、流程控制、异常处理入门实战
1.函数
Scala除了方法外还支持函数。方法对于进行操作,函数不是。
要定义函数,你需要给出函数的名称、参数和函数体。语法如下:
def 函数名(值1:参数类型1) = 函数体
必须给出所有参数的类型。
只要函数不是递归的,就不需要指定返回类型。Scala编译器可以通过=符号右侧的表达式的类型推断出返回类型。
如果函数体需要多个表达式完成,可以用代码块。块中最后一个表达式的值就是函数的返回值。例如:
def fac(n : Int) = {
var i = 1
for(i <- 1 to n) r = r *i
r
}//r的值就是函数的值
在匿名函数中,return并不返回值给调用者,它只是跳出到包含它的带名函数中。可以把return当做是函数版的break语句,尽在需要时使用。
对于递归函数,必须指定返回类型。例如:
def fac(n : Int) : Int = if(n <= 0) 1 else n * fac(n - 1)
package com.scala.chapter02
object Hello {
def main(args : Array[String]) : Unit = {
println("Hello Scala!")
//doWhile
println(looper(100,298))
}
def doWhile(){
var line = ""
do{
line = readLine()
println("Read:" + line)
}while(line != "")
}
def looper(x : Long, y : Long) : Long = {
var a = x //100
var b = y //298
while(a != 0){
val temp = a //100 98
a = b % a //98 = 298%100 100%98
b = temp //100 98
}
b
}
}
2.1条件表达式
在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值。你可以将if/else表达式的值赋值给变量:
val s = if(x > 0) 1 else -1
这与如下语句的效果一样:
if(x > 0) s = 1 else s = -1
不过,第一种写法更好,因为它可以用来初始化一个val。而在第二种写法当中,s必须是var。
Scala中的分号绝大多数情况下不上必需的。
Scala的if/else将在Java和C++中分开的两个语法结构if/else和?:结合在了一起。
在Scala中,每个表达式都有一个类型。如果一个表达式的类型不统一,它们的公共超类型叫做Any。
如果else部分缺失了,比如:
if(x > 0) 1
那么有可能if语句没有输出值。但是在Scala中,每个表达式都应该有某种值。这个问题的解决方案是引入Unit类,写作()。不带else的这个if语句等同于
if(x > 0)1 else ()
你可以把()当做是表示“无有用值”的占位符,将Unit当做Java或C++中的void。
说明:Scala没有switch语句,不过它有一个强大得多的模式匹配机制。
2.2语句终止
在Scala中,行尾的位置不需要分号。不过,如果你想在单行中写下多个语句,就需要将它们以分号隔开。
如果你在写较长的语句,需要分行来写的话,就要确保第一行以一个不能用语句结尾的符号结尾。
s = s0 + (v - v0) * t +//告诉解析器这里不是语句的末尾
0.5 * (a - a0) * t * t
2.3块表达式和赋值
在Scala中,{}块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。这个特性对于那种对某个val的初始化需要分多步完成的情况很有用。例如:
val distance = {val dx = x - x0;val dy = y - y0;sqrt(dx * dx + dy * dy)}
{}块的值取其最后一个表达式。
在Scala中,赋值动作本身是没有值的——或者,更严格地说,它们的值是Unit类型的,这个类型只有一个值,写作“()”。
由于赋值语句的值是Unit类型的,所以不能把一个Unit类型的值赋值给一个变量。
2.4输入和输出
如果要打印一个值,可以用print或println(最后换行),另外,还有一个带有C风格化字符串的printf函数。
可以用readLine函数从控制台读取一行输入。如果要读取数字、Boolean或者是字符,可以用readInt、readShort、readLong、readFloat、readDouble、readBoolean或者readChar。与其他方法不同,readLine带一个参数作为提示字符串。
readLine("Your name:")
readInt()
2.5循环
Scala拥有与Java和C++相同的while和do循环。
Scala没有与for(初始化变量;检查变量是否满足某条件;更新变更)循环直接对应的结构。如果你需要这样的循环,有两个选择:一是使用while循环,二是使用如下for语句:
for(i < -1 to n)//1 to n这个调用返回数字1到数字n(含)的Range(区间)。
r = r * i
遍历字符串或数组时,通常需要使用从0到n - 1的区间。你也可以用until方法而不是to方法,util方法返回一个并不包含上限的区间。
val s = "Hello"
var sum = 0
for(i <= 0 util s.length)
sum += s(i)
你也可以直接遍历对应的字符序列:
var sum = 0
for(ch <= "Hello") sum += ch
在Scala中,对循环的使用并不如其他语言那么频繁。可以通过对序列中所有值应用某个函数的方式来处理它们,而完成这项工作只需要一次方法调用即可。
说明:Scala并没有提供break或continue语句来推出循环。有如下几个选项实现break的作用:
1、使用Boolean型的控制变量。
2、使用嵌套函数——可以从函数当中return。
3、使用Breaks对象中的break方法。
2.6高级for循环和for推导式
Scala中的for循环比起Java和C++功能要丰富得多。
可以以变量<-表达式的形式提供多个生成器,用分号将它们隔开。例如:
for(i <- 1 to 3;j <- 1 to 3)print((10 * i + j) + " ")
//将打印11 12 13 21 22 23 31 32 33
每个生成器都可以带一个守卫,以if开头的Boolean表达式:
for(i <- 1 to 3;j <- 1 to 3 if i != j)print((10 * i + j)+ " " )
//将打印11 13 21 23 31 33
如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值:
for(i <- 1 to 10)yield i % 3
//生成Vecor(1,2,0,1,2,0,1,2,0,1)
这类循环叫做for推导式。
for推导式生成的集合与它的第一个生成器是类型兼容的。例如:
for(c <- "Hello";i <- 0 to 1)yield(c + i).toChar
//将生成"HIefmlmop"
说明:如果你愿意,你也可以将生成器、守卫和定义包含在花括号当中,并可以以换行的方式而不是分号来隔开它们:
for{ i <-
from = 4 - i;
j <- from to 3}
2.异常
Scala异常的工作机制和Java和C++一样。当抛出异常时,比如:
throw new IllegalArgumentException("x should not be negative")
当前的运算被中止,运行时系统查找可以接受IllegalArgumentException的异常处理器。控制权将在离抛出点最近的处理器中恢复。如果没有找到符合要求的异常处理器,则程序退出。
和Java一样,抛出的对象必须是java.lang.Throwable的子类。与Java不同的是,Scala没有“受检”异常——你不需要声明说函数或者方法可能会抛出某种异常。
throw表达式有特殊的类型Nothing。这在if/else表达式中很有用。如果一个分支的类型是Nothing,那么if/else表达式的类型就是另一个分支的类型。
捕获异常的语法采用的是模式匹配的语法,例如:
try{
process(new URL("http://horstmann.com/fred-tiny.gif"))
}catch{
case _:MalformedURLException => println("Bad URL:" + url)
case ex:IOException => ex.printStackTrace()
}
和Java或C++一样,更通用的异常应该排在更具体的异常之后。
如果不需要使用捕获的异常对象,可以使用“_”来替代变量名。
try/finally语句让你可以释放资源,不乱有没有异常发生。
注意,try/catch和try/finally的目的是互补的。try/catch语句处理异常,而try/finally语句在异常没有被处理时执行某种动作(通常是清理工作)。可以把它们结合在一起成为单个try/catch/finally语句:
try{...}catch{...}finally{...}
这和下面的语句一样:
try{try{...}catch{...}}finally{...}
object Exception {
def main(args : Array[String]){
val n = 99
try{
val half = if(n % 2 == 0)
n / 2
else new RuntimeException("N must be event")
}catch{
case e: Exception => println("The exception is :" + e.getMessage)
}finally{
}
}
}