您的位置:首页 > 其它

scala初学之函数定义、流程控制、异常处理入门

2017-12-08 16:27 363 查看
特此声明,本文中的代码 部分或全部来源王家林的scala教程;虽然王家林一直被大家所诟病,而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的,他只是拿过来翻译一次,看他的视频也是能了解一些东西的;但是很多东西讲的确实欠缺;所以在学习的过程中把自己的很多思考注释到了他的代码中。一是当作自己的备忘,二也希望能够给大家带来一些些的帮助。也希望自己能把一百多集20分钟左右的视频都看完,思考完,并有所标注。

进入正文:

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 = readLine
println("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=x
var 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=a
a=b%a
b=temp
}
b//···一个孤零零的b变量,直接作为了返回值 乐意的话加上 return也可以
}//函数调用剑main中的1.2

def main(args: Array[String]): Unit = {
//1.1
doWhile //调用doWhile函数 当然写成doWhile()也是正确的,这里又是简写了

//1.2
println(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.1
for(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 = 99
try {//和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)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: