zoukankan      html  css  js  c++  java
  • Scala学习二——控制结构和函数

    一.if表达式有值

      val s=if(x>0) 1 else -1,相当于Java中x>0?1:-1(不过不拿呢个在?:中插入语句),而且Scala中可以用混合类型(如if (x>0) "Hello" else -1)。

      注:像 if(x>0) 1这样if语句可能没有输出值,但是在Scala中每个表达式都有值(此时是引入了一个Unit类,写做()[表示“无有用值”的占位符]。

        REPL中想换行用{},想粘贴输入paste进入粘贴模式,然后Ctrl+D退出。

    二.块也有值——是它最后一个表达式的值

      块语句是一个包含{}的语句序列,包含一系列表达式,其结果也是一个表达式,块的值是块中最后一个表达式的值。[可以利用中间值分多步完成结果],一个以赋值语句结束的块的值是Unit类型的。

    三.Scala的for循环(像增强版的Java for循环)

      while和Java一样,for循环为for(i <- 表达式)其中<-会让i遍历右边的表达式中的所有值,如(for(i <- 1 to n) r=r*i会遍历1到n),遍历字符串或者数组时使用util方法如下:

    val s="Hello"
    var sum=0
    for (i<- 0 util s.length) //i的最后一个取值为是s.length-1
        sum+=s(i)

      注:Scala中没有像Java中提供break和continue退出循环,可以使用Boolean值控制变量;使用嵌套函数——从函数中return;使用Breaks对象中的break方法(较慢)。

        for循环高级特性:

          1.以变量<-表达式提供多个生成器,如:

      

          2.每个生成器带一个判断,以if开头的Boolean表达式:

           3.使用任意多的定义,引入可以在循环中使用的变量:

           4.for推导式:

      

    四.分号(在绝大多数情况下不是必须的)

      只有在同一行中写下多个语句需要用分号隔开,其他只要上下文能够明确的判断出哪里是语句的终止都不需要分号。

    五.void类型是Unit

      Unit是Scala引入的一个类写作()表示无用值,喜爱嗯当与void  

    六.避免在函数定义中使用return

      Scala函数定义:给出函数名称,参数,函数体,如(def abs(x:Double)=if(x>=0) x else -x),必须给出所有参数类型,只要函数不是递归的就不用给出返回类型。

      Scala中会使用大量的匿名函数,这些函数中return并不返回值给调用者,return一般当作函数版的break语句。

      默认参数(调用函数时并不显示给出所有参数值),如def decorate(str:String,left:String="[",right="]")=left+str+right,left和right就有默认值

      带名参数(顺序可不一致,让函数更可读),如decorate(left="[",str="haha",right="]")

      变长参数(接受可变长度参数列表):

        注:当作参数序列1 to 10:_*(val s=sum(1 to 5:_*))  

    def sum(args:Int*)={
     var result=0
     for(arg<-args) result+=arg
     result      
    }

    七.避免在函数式定义漏掉=

      如果函数体包含花括号但没有前面的=号(def box(s:String){........}),那么返回类型为Unit,这样的函数称为过程,最好显示的声明def box(s:String):Unit={......}。

      那么函数就更要注意不要把=漏掉了。

    八.懒值

      当val被声明为lazy时,它的初始化将被推迟,直到对它首次取值(对于开销较大的初始化语句而言非常有用),还可以应对循环依赖等问题,懒值介于val和def之间。

      注:懒值也会有额外的开销,每次访问懒值时,都会有一个方法被调用,而这个方法以线程安全的方式检查该值是否已经初始化。

    九.异常的工作方式和Java,C++一样(区别在catch语句中使用“模式匹配”)

      和Java一样,抛出的对象必须是java.lang.Throwable的子类(区别:Scala没有“受检”异常——不需要声明函数或者方法可能会抛出某种异常)。

      “受检”异常:在编译期被检查,比如可能会抛出IOException,就必须声明,这要求程序员必须去想在哪儿处理这些异常(很不错的目标),但是可能导致过早的捕获异常,或者超通用的异常类。

      try{...}catch{...}finally{...}如:

    try{
    process(new URL("http://....."))
    }
    catch{
    //不需要使用捕获的异常对象,可以使用_来替代变量名
    case _:MainformedURLException=>println("Bad Url"+url)
    case ex:IOException=>ex.printStatckTrace()
    }

      注: 

     十.练习

      

       1.

    def signum(num:Int)={
    if(num>0) 1
    else if(num<0) -1
    else 0
    }

      

       2.可知空的{}的类型是Unit,返回值是()

       3.注意:在Scala中,赋值语句是Unit类型,所以只要给x赋值为Unit类型就行

     

       4.

    for(i <- 0 to 10 reverse )
    print(i+"	")

       5.

    def countdown(n:Int){
    
    (0 to n reverse) map print
    
    }

       6.

    var t:Long=1
    
    for(ch <- "Hello"){
    
    t=t*ch
    
    }

       7.

    var t:Long=1
    
    "Hello".foreach(t*=_)

       8.

    def product(str:String):Long={
    
    var t:Long=1
    
    str.foreach(t*=_)
    
    t
    
    }

       9.

    def product(str:String):Long={
    
    if(str.length==1)
    
    str.charAt(0).toLong
    
    else
    
    str.charAt(0)*product(str.drop(1))
    
    }

       10.

    def xn(x : Double ; n : Int) : Double={
    
    if (n==0)
    
    1
    
    else if (n <0)
    
    1/xn(x,-n)
    
    else if (n%2==0)
    
    xn(x,n/2)* xn(x,n/2)
    
    else
    
    x*xn(x,n-1)
    
    }

     

  • 相关阅读:
    IcePatch2+IceGrid部署的解决方案
    设计模式——状态模式(State)
    设计模式——单例模式(Singleton)
    设计模式——工厂方法模式(Factory Method)
    FreeType编译
    OO Design之SOLID原则
    设计模式——策略模式(Strategy)
    C++之Name Hiding
    设计模式——抽象工厂模式(Abstract Factory)
    【转】FreeType介绍
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/11941250.html
Copyright © 2011-2022 走看看