Scala学习笔记(二):控制结构和函数

2.1 条件表达式

      2.1.1 Scala中if/else语法结构和java一样,不同点在于此if表达式有值:

          val s=if (x>0) 1 else -1        //s的值要么是1,要么是-1,取决于X的范围

         在Scala中,每个表达式都有一个类型,如下是混合表达式类型:

         if(x>0)  "positive" else -1      //此表达式是两个分支类型的公共超类型,一个是java.lang.String,一个是int,他们公共超类是Any

        如何else部分缺失了,比如:

         if(x>0) 1 //

         每个表达式都有值,这个问题的解决方案是引入一个Unit类(类似于JAVA中的void),写作(), 此语句等同于if(x>0) 1 else ()

      注意点:REPL中一般只读取一行数据,用花括号可以解决此问题,或者可以使用粘贴模式。键入:paste 把代码粘贴进去,然 

      后按下Ctrl+D即可

2.2 语句终止

   2.2.1 单行中写多行需要用分号,一般不会使用分号

   2.2.2 如果语句较长,需要分两行写,一般使用{}

            if(n>0) {

                          r=r*n

                          n-=1 

                         }

   2.3 块表达式

     2.3.1块表达式用于存放多个动作,在scala中使用{}块包含一系列表达式,其结果是最后一个表达式,块中最后一个表达式的值就是块的值。

     2.3.2  一个赋值语句块{r=r*n;n-=1},因为赋值语句是没有值的也及是Unit类型,所有此代码块也是Unit类型

  2.4输入和输出

    2.4,常见输出print和println,另外还与一个printf("Hello,%s! you are %d years old.\n","Fred",24)

    2.4.2常见输入操作readLine从控制台读取一行输入。如果对其数字,Boolean或者字符,可以用readInt、readChar等,readLine带一个参数作为输入提示符:

    val name=readLine("you name:")

2.5循环

2.5.1 while循环和jave相似

2.5.2 Scala的for与java有差异,for(i<-1 to n)     r=r*i   //其中:1 to n是使用RichInt类的to方法,返回1到n的数字

2.5.3  语法结构:

           for(i <- 表达式)

         让变量ib遍历<- 右边表达式的所有值,遍历字符串和数值时,你通常需要使用0到n-1的区间,这时你可以才用until方法而             不是to方法,util方法返回一个并不包含上限的区间。比如:

         val s="hello"

          val sum=0

        for (i < - 0 until s.length)   

              sum +=s(i)

     我们也可以直接遍历对应的字符序列

      var sum=0

     for(i<-"hello") 

         sum +=i

  注意:Scala不支持break和continul语句退出循环,如果要break可以采用如下方式:

             1.使用Boolean类型的控制变量

             2.使用嵌套函数----你可以从函数中return

             3..使用Breaks对象的break方法。

              import scala.util.contorl.Breaks._

                 breakable {

                        for(....) {

                                         if(......) break;

                                     ......

                                   }

                                     }

2.6高级for循环和for推导式

       2.6.1你可以变量<-表达式的形式提供多个生产器,用逗号将他们隔开。例如

           for(i <- 1 to 3;j < - 1 to 3)    print((10*i+j)+" ")  //打印 11 12 13 21 22 23 等

           每个生成器都可以带一个守卫,已if开头的Boolean表达式:

           for (i <- 1 to 3; j< - 1 to 3 if i !=j)     print((10*i+j)+" ")   //注意在if 之前没有分号

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

          for(i < - 1 to 3; from=4-i;j<- from to 3) print((10*i+j)+" ")  //将打印 13 22 23 31 

           如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值:

           for(i <- 1 to 10) yield i %3   //生成:Vector(1,2,0,.....)

2.7 函数

        方法对对象进行操作,函数不是,函数定义如下:

         def abs(x:Double) = if (x>=0) x else -x 

         必须给出所有参数的类型,不过,只要函数不是递归的,就不需要指定返回值类型。

         对应递归函数必须指定返回值类型:

          def fac(n:Int) :Int=if(n<=0) 1 else n*fac(n-1)

2.8 默认函数和带名函数

      默认函数就是可以为函数的参数提供默认值,也可以传入提供的值 

     例如:def decorate(str:String ,left:String="[", right:String="]")=left+str+right

    调用时可以用decorate("hello") 得到[hello], 也可以用decorate("hello","<",">") 得到<hello>

2.9变长函数

     def sum( args:Int*)={

       var results=0

       for( arg<-args) results+=arg

         results  }

        调用val s= sum(1,4,8,6)  也可以使用val s=sum(1 to 9:_*) 

2.10无返回值函数

         def box(x:String) :Unit = {        相应语句               }

2.11懒值

         当val被生命为lazy时,它的初始化将被推迟,知道我们首次对它取值

          lazy val words=scala.io.Source.fromFile("/usr/words").mkString.

2.12异常

        try { process(new URL("http:www.baidu.com")) }

        catch {

                case _:MalformedURLException=> println("Bad URL"+url)

                case ex:IOExcept => ex.printStackTrace()

                }

           finally {                    }

  

   

猜你喜欢

转载自blog.csdn.net/fengfengchen95/article/details/81530230