Scala基础(草记)



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)
}
----------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值