如下是近期Scala学习过程当中的简单记录,因为理解能力的问题,初期的东西可能会有很多疏漏和理解错误的地方,后期再逐渐改善。若是有不入高手法眼的地方也至关欢迎前来指正。另笔记顺序没什么依据,彻底根据看书的进度来(书名是《Scala编程》)java
概念理解:
首先Scala鼓励使用函数式的编程风格,这种风格我如今理解为函数应该处理和本身相关的东西,而不关心以外的事件。即处理数据的函数只应该处理数据后返回结果,而某些返回结果的则应该专一于结果的展现。还有尽可能少的使用var编程
1、基本类型和操做符
1.基本类型
与Java相同,有Byte、Short、Int、Long、Char、String、Float、Double、Boolean,除String外,其他都为Scala成员。使用时Scala社区推荐的风格是使用大写开头。
另外Scala中定义了一批基本类型的富包装类,相似于Java中的包装类,提供了一些经常使用的方法。但经过隐式转换在使用上要方便很多,全部的scala基本类型都有对应的富包装类,如RichByte、RichShort、RichInt、RichLong、RichChar、RichFloat、RichDouble、RichBoolean。
2.操做符
Scala中操做符分为前置操做符(+、-、!、~,这些操做符也是函数,被定义为unary_开头的方法,例如unary_+)、中置操做符(全部只有一个参数的函数均可以做为中置操做符,好比 "abc" indexOf "a",至关于调用"abc".indexOf("a"))、后置操做符(不带任何参数的函数,好比 123 toString)
2、变量
scala中变量定义以var或val开头,var用于声明可变变量,val声明不可变变量,相似于Java中的final。var变量可屡次进行从新赋值,val只能赋值一次
变量赋值,例如val a = 0;能够没加类型声明,scala会自动推断类型,也能够手动的加类型声明 val a:String = "abc"
。数组
3、函数
1.函数的定义
大部分和Java中的规范相同,不一样之处是Scala中可使用像+、-这样的函数名,例如1+2
实际调用的是1.+(2)
。
2.有返回值的函数
以def开头后加函数名,例如 def fun(a:Int,b:String)={}
,有两个参数,一个参数为a类型为Int,另外一个为b类型为String,后跟一个等号,在等号前能够声明函数的返回类型,一般状况下不须要作声明scala会根据函数体(花括号中的内容)的最后一行表达式的内容(即返回值)来推断返回类型。Scala也会将函数体最后一行的表达式结果做为函数返回值,而不须要手动的使用return返回。
3.没有返回值的函数
若是函数没有返回值,则能够省略函数定义中的等号,返回值类型为Unit(至关于Java中的void,但有些不一样,具体的区别后面再讲)。 例如 def fun() {println("a")}
函数
有一种状况函数的返回类型的声明则是必要的,即递归函数。
当函数体中只包含一个表达式时,则表达式外的花括号能够省略, 例如:def test(a:Int,b:Int) = a + b
。还有Scala中语句结尾的分号是可省略的
3.好吧,还有一个是分号推断,这个我实在不知道该放到哪一个分类下,就写这儿吧!大意就是大多数正常换行写代码的状况下是不须要写分号的(固然写了也能够)。只有在如下一种状况成立的条件下须要分号:
(1)疑问行由一个不能合法做为语句结尾的字结束,如句点或中缀操做符(加、减、乘、除等)
(2)下一行开始于不能做为语句开始的词
(3)行结束于括号()或方框[]内部工具
4、类和对象
1.类的定义
使用class关键字,例如class test{}
。
2.类构造器
scala中类的构造器分两种,一种是主构造器,一种是辅助构造器
主构造器定义于类的定义中。像class test(val name:String,val age:Int)
这样,如同Java同样当不定义主构造器时,会自动生成一个无参的主构造器。主构造器函数的范围则在类名后的花括号中,例class test{//这里即为主构造器}
。也有别的规则以下:
主构造器中的参数 生成的字段、方法val/var name:String
私有name字段,生成公共的只读或者可写的方法private val/var name:String
私有name字段,生成私有的只读或者可写的方法@BeanProperty val/var name:String
同上,有些注解会生成额外Java版的公有的 geter和seter方法name:String
若是有方法中使用此参数,则生成字段,等同于 private[this] val name,不然无此字段
辅助构造器
辅助构造器的名称为this,辅助构造器中必须调用其它的辅助构造器或者是主构造器。
3.单例对象
scala中不能定义静态成员,而使用单例对象,单例对象的定义使用object关键字,且没有参数,其他的和类一致。当单例对应与某个类名称相同时,称这个单例对象是某个类的伴生对象,且类的伴生对象必须与类定义在同一个文件中。类和它的伴生对象能够相互访问之间的私有成员。且单例对象第一次被访问时才会被初始化
与类不一样名的单例对象叫独立对象,可看成工具类或程序的入口使用
5、控制结构
1.if表达式
语法和Java相同,不一样的地方是scala的if语句是有返回值的,例如val res = if(1=2) 1 else 2
。
2.while循环
这个和java没什么不一样的,且并不会有返回值。因为没有返回值while循环的做用一般是更改某个var的值或者执行I/O操做。因此在可能的状况下并不太建议使用while循环
3.for循环
for循环在scala中有着比较强大的功能。下面逐一介绍
(1)枚举集合类for(a <- List(1,2,3))
此例中<-操做符至关于Java中加强for循环中的:操做符。但不须要声明a的类型,scala会推断类型
(2)过滤
scala的for循环中能够过滤循环的集合,经过条件守卫只循环其中的某一部分,示例以下:for(a <- 0 to 10 if(a % 2 == 0))
,也能够添加多个条件守卫,守卫之间用分号隔开,不过当使用花括号时能够省略分号学习
/*使用小括号时须要加分号*/ for(a <- 0 to 10 if(a != 1);if(a != 2)) /*使用花括号时多个条件守卫能够省略分号*/ for{a <- 0 to 10 if(a != 1) if(a != 2) }
(3)嵌套枚举
循环条件中能够加入多个循环,每一个循环均可以带本身的条件守卫。好比this
for(a <- 0 to 10 if(a % 2 == 0) b <- 0 to 10 if(b % 2) != 0)
(4)流间变量绑定scala
/** trimmed被定义在第二个循环中,且在第二个条件漂守卫和循环体中使用,属于代码简化方式*/ for{ file <- filesHere if file.getName.endsWith(".scala") line <- fileLines(file) trimmed = line.trim if trimmed.matches(pattern) } println(file + ": " + trimmed)
(5)创造新集合
scala中的for循环可使每次循环结果以集合的方式返回,使用的关键字为yield,示例以下:code
Array arr = Array(1,2,3,4,5,6,7,8,9) /** 此循环产生的结果是一个只包含偶数的数组,返回的集合类型与循环时遍历的集合类型一致, 须要注意的地方是yield关键字应当放到循环体以外,也就是若是循环体有花括号时yield关键字 应当放在循环体的花括号以前,for(//循环条件) yield {//循环体}*/ for(a <- arr if(a % 2 == 0)) yield a
4.异常处理
(1)抛出异常
语法和Java的相同,throw new RuntimeException()
但在scala中抛出异常的语句是有返回值的,返回值类型为Noting,是全部类型的子类。具体的之后讲,如今只先大概了解一下。
(2)捕获异常
使用scala中的一种叫模式匹配的方式进行异常捕获。语法以下,好像也没啥可说的。finally子句也和Java中的相同。不一样之处是try catch语句也有返回值的。还有最好别在finally子句中使用return返回结果,不然这个返回结果会覆盖以前的正常try中的结果。对象
try{ val f = new FileReader("test.txt") }catch{ case ex:FileNotFoundException => //处理文件丢失 case ex:IOException => //处理IO问题 }finally{ }
5.变量范围,这个里惟一不太同样的地方是,scala中容许嵌套范围里定义同名变量,例如:
var a =1 { var a = 2 { //此处打印2 println(a) } }