Scala:函数基本概念

时间:2022-10-02 17:59:55

函数

//无输入函数  def <identifier> = <expression>
def hi ="hi"
//无输入指定返回类型函数 def <identifier>:<type> = <expression>
def hi:String ="hi"
//完整函数def <identifier>(<identifier>:<type>[,...]):<type> = <expression>
def multiplier(x:Int,y:Int):Int =x*y
//用空括号定义函数 def ():<type> = <expression> //便于区分函数和值
def good():String="good"
//空括号函数的调用方式
good() //可以调用
good //可以调用
def good1:String="good1"
good1 //可以调用
good() //不可以调用
//使用表达块调用函数 <function identifier><expression block>
def formatEuo(x:Double)= f" C $x%.2f "
formatEuo(2341.5)
formatEuo{val i= 23344; i*2344.5} //使用表达式块调用
/**
* 递归函数,自身调用自身,需要检查某类参数和外部条件来避免函数调用进入无限循环。
* 递归函数如果递归次数较多 会发生栈溢出的错误
* scala通过尾递归 优化部分递归函数,使递归调用不采用额外的栈空间。
* 只有最后一个语句是递归函数才能由优化为尾递归
* 利用函数注解(function annotation)标记的函数会完成 尾递归的优化
*/
def power1(x:Int,n:Int):Long={
if (n>1) x * power1(x,n-1)
else 1
}
//尾递归优化
@annotation.tailrec
def power(x:Int,n:Int,t:Int=1):Long={
if (n< 1) t
else power(x,n-1,x*t)
}
//嵌套函数:函数表达式,中依然包含函数
def max(a:Int,b:Int,c:Int) :Int={
def max(a:Int,b:Int)={
if(a>b) a else b
}
max(a,max(b,c))
}
//命名参数调用函数
def greet (prefix:String,name:String)=s"$prefix ,: $name"
greet("ms","bown")
println(greet(name = "andy", prefix = "ha"))
//有默认值的参数
def greet1 (prefix:String="你是帅哥",name:String)=s"$prefix ,: $name"
//类型参数 def <function-name>[type-name]:(parameter-name:<type-name>):<type-name> ...
def identity[A](a:A):A= a

过程(Process):没有返回值的函数

//process
def log(x:Double) = println(s"${x}")
//过程的另一种写法,已经废弃
def log1(x:Double) {println(s"${x}")}