特此声明,本文中的代码 部分或全部来源王家林的scala教程;虽然王家林一直被大家所诟病,而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的,他只是拿过来翻译一次,看他的视频也是能了解一些东西的;但是很多东西讲的确实欠缺;所以在学习的过程中把自己的很多思考注释到了他的代码中。一是当作自己的备忘,二也希望能够给大家带来一些些的帮助。
进入正文:
package com.dt.scala.hello/**** 这是第二集视频中的代码* 主要将函数的定义、函数的调用、if判断、循环和控制、异常处理、静态代码块 ** */
object ScalaBasics {//在object中所有的一切都是静态的(包括方法和代码块)//1.方法的定义//1.1无参方法的定义/*def就是用来定义方法的 ;doWhile是方法的名称;Unit是返回类型,相当于java中的void */def doWhile(): Unit={/** 这是一种完全的写法,下面的写法也是正确的* * def doWhile(){}* def doWhile()={}* def doWhile{}* def doWhile={}* def doWhile:Unit={}* * 但是这种定义是不正确的* def doWhile():Unit{}* * 为什么可以省略返回值类型呢?因为scala会把最后一行的变量或者运行结果当作返回值,那么返回值的类型也就由* scala的类型推断机制来完成了 (Unit也是一种变量类型和运行结果)* *///又想起了scala中一个语句后面是不需要写那个;号的,其实挺爽的,写上一万行代码就少敲一万下键盘不是么var line = "" //这里定义了一个var 类型的变量 这里用var的话,就是说这个line变量可以被多次赋值//也就是说,我写了line = "123";line = "456";这样的多次赋值是可以被接受的。//在java中我们定义一个字符串的时候是这样的 String line = "";这个line在java中也可以被无数次的赋值//其实严格的说scala中我们定义一个字符串的话应该这样来写 var line:String =""//但是我们却可以直接写成 var line =""//主要因为两点 第一、scala中的变量必须初始化 第二、scala中提供了自动的类型转换 //首先来说第一点,我们在java中这样写 String line;是正确的。但是在scala中如果写 //var line:String 错误//var line 错误//var line:String;错误//var line;错误//只有var line:String="" 和 var line=""是正确的//第二点 scala中体中了自动类型转换,也就是说 由于我的变量必须赋值,那么变量的类型完全可以又变量的值来推出//因此 var line:String=""也就变成了var line = "" 不得不说又少敲键盘了/**********************************************************************************************//*和var相对立的还有一个 叫val的标识符,和var一样,val也必须初始化,也可以省略掉变量的类型* 唯一不同地方就是 val 标识的变量初始化以后是不可再赋值的 相当于java中在变量前加上了final关键字一样* 例如 val line = "" ;然后再赋值 line="123"就会报错 ;如同java中的 final String line ="";一样* 在scala中更加鼓励使用val来定义变量,(个人理解,这个对于减少方法的副作用有帮助,同时有利于多线程和函数式编程)* */do{//和java中的do-while循环是一样的line=readLine()//相当于java中的new Scanner(System.in).nextLine(); 这个readLine在scala。Predef包中,scala默认引入该包//其功能就是读入一行用户的输入并赋值给line//也可以简写为 line = readLineprintln("Read: " + line)//输出 相当于java中的System.out.println(-------);}while(line != "")//循环条件为line不是空字符串}//调用见main函数中的1.1//1.2 带参数和返回值的方法的定义// def用来定义函数 looper函数名 x:Long,y:Long 两个Long类型的参数 ):Long 返回值类型def looper(x : Long,y :Long): Long={/*关于方法签名的各种省略写法和doWhile是一致的*/var a=xvar b=y//分别把x和y赋值给了var类型的a和b//因为下边要在循环中不停的修改a和b的值所以是var来定义//那为什么不直接操作x和y呢//因为x和y都是val类型的, 也就是所在scala的所有方法中参数都是val类型的也就是说如果用java来描述这个函数的话应该是这样// public static Long looper(final Long x,final Long y){}//在java的代码重构中提到针对与函数的变量的赋值是一种代码的坏味道,可能会引起代码的副作用//val对于多线程的处理意义重大,大家可以百度while(a!=0){//这就是个循环了 while循环var temp=aa=b%ab=temp}b//···一个孤零零的b变量,直接作为了返回值 乐意的话加上 return也可以 }//函数调用剑main中的1.2def main(args: Array[String]): Unit = {//1.1doWhile //调用doWhile函数 当然写成doWhile()也是正确的,这里又是简写了//1.2println(looper(100,298))//直接输出函数的调用结果//2 if语句//2.1 scala中的if判断var file = "scala.txt"if(!args.isEmpty) file=args(0)//如果传入的参数不为空,赋值为args(0)//2.2 对2.1的简写var fileo = if(!args.isEmpty) args(0) else "scala.txt"//看起来挺新鲜,其实就是java中的 String x = !args.isEmpty()?args(0):"scala.txt";/*两个输出 没啥好说的*/ println(fileo)println(file)//3 for循环//3.1for(i <- 1 to 10){//在java中我们写for(int i=1;i<=10;i++)//首先看看这个 1 to 10 其实是一个语法糖,在scala中做到了一切皆对象,//所以你写个 1 我去这也是一个对象(scala会通过隐士转化的方式把你的1转换为一个RichInt对象)//所以呢 to就是1的一个方法 本尊应该这样写 1.to(10) 这个方法返回一个Range··也就是一个java中的list的意思//所以 <- 这个东西就是 把 1.to(10) 的返回值依次赋给i然后进入循环体中运行println("Number is:" +i)}//3.2 由3.1的分析可以知道 这样写也是对的for(i <- 1.to(10)){println("Number is:" +i)}//3.3 scala中的增强for循环 相当于java中的for(String x:list){}val files= (new java.io.File(".")).listFiles()//这句不用管,就是返回当前目录下的所有文件的一个Array对象for(file <-files){//把files依次赋值给file,进入循环体中运行//我觉得这个就不要说什么增强的for了//因为2.1可以这样写啊//val test=1 to 10//for(i <- test){//println("Number is:" +i)//}//所以只不过是把list的获得放在for()在外和之内的区别,没有像王某说的还有个增强for循环println(file)}//4 初次接触scala中的异常处理val n = 99try {//和java一样,使用try catch finally 结构来做异常处理 ;唯一的改变就是在catch处//抛出一个运行时异常val half =if(n%2==0) n/2 else throw new RuntimeException("n must be even")}catch{//在java中是//catch(xxxxException e){}//..........//catch(Exception e){}//为了处理异常我们会写一档对的catch函数,然后在不同的catch函数中针对特定的异常进行处理//在scala中直接省去了对异常的传入,而且永远只有一个catch了//针对不同的catch我们可以这样写//catch{//case e:xxxxException => doSomeThing//...//case e:Exception => doSomeThing//}//这样写比起java中的一堆堆看起来要舒心了很多啊//case 用来作为一个分支判断 e:Exception 用来指定异常的类型 是case的判断条件 如果 也就是如果//e匹配Exception类型,那么 => 指向了要执行的操作case e:Exception => println("The Exception is : "+e.getMessage())}finally{//和java中的finally的作用相同}}//静态代码块 由于在object中所有的所有都是静态的,所以包括一个语句都是静态的//java中的static{...}在类加载的时候就会执行//这里的三行代码也是一样的,他们没有包含在任何的方法体中,会在代码加载的时候执行 而且是在main函数调用之前执行var line=""line=readLine()println("Read_Out: " + line)
}