Scala编程思想
www.scala-lang.org/download/
---------------------------------------------------------------------
scala-ide.org
|-创建一个scala project
|-创建一个包
|-创建一个scala sheet
|-测试
---------------------------------------------------------------------
%scala_Home%\bin;%scala_Home%\jre\bin;
.;%scala_Home%\bin;%scala_Home%\lib\dt.jar;%scala_Home%\lib\tools.jar;
---------------------------------------------------------------------
scala shell运行xxx.scala
scalac xxx.scala
scala xxx 参数
即可
---------------------------------------------------------------------
变量
三种变量修饰符,
val 定义immutable variable
var 定义mutable varible
lazy val
注意:可以不显示指定变量的类型,因为scala会自动宁进行类型推导
---------------------------------------------------------------------
函数
def functinName(param:ParamType):ReturnType = {
//function body:expressins
}
if表达式
if(logical_exp) valA else valB
if(true) 1 else 2 //>res0:Int = 1
if(false) 3 else 4 //>res1:Int = 4
val a = 1
if(a == 1) a //>res2:AnyVal = 1
if(a != 1) "not one" //>res3:Any = ()
if(a != 1) "not one" else a //>res4:Any = 1
---------------------------------------------------------------------
for comprehension
for{
x <- xs
y = x + 1
if(y > 0)
}yield y
val l = List("alice","bobo","cathy")
for(
s <- l
)println(s)
for{
s <- l
if(s.length > 3)
}println(s)
val result_for = for{
s <- l
s1 = s.toUpperCase()
if(s1 1= "")
}yield(s1)
---------------------------------------------------------------------
try表达式
try{}
catch{}
finally{}
try{
Integer.parseInt("dog")
}catch{
case _ => 0
}finally{
println("always be printed")
}
--------------------------------------------------------------
match表达式
exp match{ //主要用在pattern match中
case p1 => val1
case p2 => val2
...
case _ => valn
}
code match{
case 1 => "one"
case 2 => "tow"
case 3 => "three"
case _ => "others"
}
val result_try = try{
Integer.parshInt("dog")
}catch{
case _ => 0
}finally{
println("always be printed")
}
val code = 1
val result_match = code match{
case 1 => "one"
case 2 => "tow"
case _ => "others"
}
--------------------------------------------------------------
求值策略
Scala里有两种求值策略(Evalucation Strategy)
1、Call By Value - 对函数实参求值,且仅求值一次
2、Call By Name - 函数实参每次在函数体内被用奥时都会求值
Scala通常使用Call By Value
如果函数形参类型以 => 开头,那么会使用Call By Name
def foo(x:Int) = x //call by value
def foo (x:=> Int) = x //call by name
--------------------------------------------------------------
函数是第一等公民
Scala语言支持:
1、把函数作为实参传递给另外一个函数
2、把函数作为返回值
3、把函数赋值给变量
4、把函数存储在数据结构中
在Scala中,函数就像普通变量一样,同样也具有函数的类型
函数类型
在Scala语言中,函数类型的格式为A=>B,表示一个接受类型A的参数,并返回类型B的函数
例子:
Int => String是把整形映射为字符串的函数类型
--------------------------------------------------------------
高阶函数
用函数作为形参或返回值的函数,称为高阶函数
def operate(f:(Int,Int) => Int) = {
f(4,4)
}
def greeting() = (name:String) => {"hello"+" "+name}
--------------------------------------------------------------
匿名函数
匿名函数(Anonymous Function),就是函数常量,也称为函数文字量(Function Literal)
在Scala里,匿名函数的定义格式为
(形参列表) => {函数体}
--------------------------------------------------------------
柯里化
柯里化函数(Curried Function)把具有多个参数的函数转换为一条函数链,每个节点是单一参数
例子:
一下两个add函数定义是等价的
def add(x:Int,y:Int) = x + y
def add(x:Int)(y:Int) = x + y //Scala里柯里化的语法
--------------------------------------------------------------
递归函数
递归函数(Recursive Fnction)在函数式编程中是实现循环的一种技术
例子:
计算n!
def factorial(n:Int):Int =
if(n <= 0) 1
else n * factorial(n-1)
递归函数容易造成堆栈溢出
为此,进行优化
尾递归函数
尾递归函数(Tail Recursive Function)中所有递归形式的调用都出现在函数的末尾
当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。
尾递归的例子
@annotstion.tailrec //告诉scala编译器对参数进行尾递归优化
def factorial(n:Int,m:Int):Int =
if(n <= 0)m
else factorial(n -1,m * n)
factorial(5,1)
综合案例
object sumfunc{
def sum(f:Int => Int)(a:Int)(b:Int):Int = {
@annotation.tailrec
def loop(n:Int,acc:int):Int = {
if(n>b){
println(s"n=${n},acc=${acc}")
acc
}else{
println(s"n=${n},acc=${acc}")
loop(n+1,acc+f(n))
}
}
loop(a,0)
}
sum(x=>x)(1)(5)
sum(x=>x * x)(1)(5)
sum(x=>x * x * x)(1)(5)
val sumSquare = sum(x=>x * x)_
sumSquare(1)(5)
}
----------------------------------------------------