目录
函数定义与调用java
默认参数和带名参数数组
变长参数微信
过程app
lazy和异常机制ide
1、函数的定义和调用 def函数
scala定义函数时,须要用def作修饰,而后指定函数名,参数和函数体,在参数列表和函数体中加上 = 号,以下:学习
scala> :paste
// Entering paste mode (ctrl-D to finish)
def say(name : String,age : Int)={
println("my name is"+name+",my age is"+age)
}
// Exiting paste mode, now interpreting.
say: (name: String, age: Int)Unit
scala> say("xiaoming",18)
my name isxiaoming,my age is18
能够看出,参数用冒号指定其类型,不一样参数逗号分隔开,使用时直接调用函数名,指定参数便可spa
scala的函数也能拥有返回值,跟java不一样,scala并不适用return,而是一条语句的最后一个值就是返回值,提及来拗口,直接上代码:.net
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sayage(age : Int)={
if(age >= 18){
println("I am a adult "+ age)
age
}else{
println("I am a children "+ age)
age
}
}
// Exiting paste mode, now interpreting.
sayage: (age: Int)Int
scala> sayage(22)
I am a adult 22
res4: Int = 22
在上面的代码咱们能够看出,if分支打印输出以后都有一个单独一行的age,这就是返回值,scala对于函数的返回值基本均可以自动推断出来,但在这里仍是额外说一下,scala是能够本身指定返回值的,以下:scala
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sayAge(age : Int):Int ={
if(age >= 18){
println("I am a adult "+ age)
age
}else{
println("I am a children "+ age)
age
}
}
// Exiting paste mode, now interpreting.
看出区别了吗,对,就在def sayAge(age : Int):Int
这里,参数列表后使用冒号加类型的方式指定函数返回值
若是函数体不是多行,也能够简化去掉大括号,以下:
scala> def sayHello(name : String) = println("my name is " + name)
sayHello: (name: String)Unit
scala> sayHello("xiaoming")
my name is xiaoming
2、默认参数和带名参数
有时候咱们但愿不给参数具体值,而是使用参数默认值,scala能够作到这一点
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sayHello(name:String,age:Int = 18)=print("name:"+name+" age:"+age)
// Exiting paste mode, now interpreting.
sayHello: (name: String, age: Int)Unit
scala> sayHello("DaXin")
name:DaXin age:18
如上图代码所示,name没有默认值,必需要手动传值,age给出默认值18,使用时就能读取到
scala还支持以不按照函数定义的参数顺序来传递参数,也就是带名参数
scala> sayHello(age = 50,name = "Dad")
name:Dad age:50
像这样把参数颠倒也是能够正常使用的
3、变长参数
有时候咱们须要函数参数个数可变,这时候能够使用变长参数
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sum(numbers : Int*) = {
var result = 0;
for(number <- numbers){
result = result+number
}
result
}
// Exiting paste mode, now interpreting.
sum: (numbers: Int*)Int
scala> sum(1,3,5,6)
res2: Int = 15
注意到参数类型Int后面的*号了吗?这就是变长参数的语法,表明调用时能够传入多个Int类型
还有一种状况,咱们不想写(1,3,5,6)
这样的参数,而是前面说过的1 to 4
这样的参数,能够吗?事实上不行,由于1 to 4
本质上是RichInt类型, 而变长参数须要的是多个单Int类型,这时候就须要新的解决办法:
//:_*告诉编译器你但愿将某个参数看成参数序列处理
scala> sum(1 to 4:_*)
res3: Int = 10
4、过程
过程实际上是个很是简单的概念,若是一个scala函数的函数名和函数体之间没有使用等号链接,只是用花括号包住了函数体,那他的返回值类型就是Unit,总结一下:过程就是返回值为Unit,也就是不须要返回值的函数
scala> def say(name: String) { print("Hello, " + name)}
say: (name: String)Unit
scala> say("daXin")
Hello, daXin
5、lazy和异常机制
lazy:把一个变量声明为lazy,那么这个变量只有在真正使用的时候才会被加载,适用于耗时操做,或者只有触发某些特殊状况才会调用的变量
//定义一个长度为5的数组
scala> var slist = 1 to 5
slist: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
//已经越界,可是lazy变量不报错
scala> lazy val e = slist(5)
e: Int = <lazy>
//在使用的时候才会报错
scala> e
java.lang.IndexOutOfBoundsException: 5
at scala.collection.immutable.Range.apply$mcII$sp(Range.scala:151)
at scala.collection.immutable.Range.apply(Range.scala:149)
at .e$lzycompute(<console>:15)
at .e(<console>:15)
... 32 elided
//并且lazy只能使用val定义,var会报错
scala> lazy var num = slist(2)
<console>:1: error: lazy not allowed here. Only vals can be lazy
lazy var num = slist(2)
scala的异常和java很像,咱们来看看
//引入io包,下面会用到IO异常
scala> import java.io._
import java.io._
scala> :paste
// Entering paste mode (ctrl-D to finish)
try{//抛出Illegal异常
throw new IllegalArgumentException("error")
}catch{
//scala的catch没有(),花括号内是case来判断不一样异常,上面抛出Illegal异常,因此IO异常会跳过,在下面被捕获到
//顺便一提抛出的异常若是没有相应的case能捕获,就会报错
case e1:IOException =>print("IO fail")
case e2:IllegalArgumentException =>print("Illegal fail")
}
// Exiting paste mode, now interpreting.
Illegal fail
本文就到此结束啦,原创不易,喜欢的话点个关注呗
本文分享自微信公众号 - Spark学习指南(smartProgram)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。