1. scala 没有break,continue 可用 scala.util.control.Breaks._ 中 break,不是好方法
```
breakable{
for(){
if() break;
}
}
```
2. 变长参数
```
def test(args:Int*)={
for(arg<-args)println(arg)
}
test(1 to 5:_*) // _* 告诉编译器参数当参数序列处理
```
3. Array,ArrayBuffer
```
val a=new Array[Int](10)
a.toBuufer
Array.ofDim[Double](3,4) //3行,4列
Array("hello","world")
val b=ArrayBuffer[Int]()
b+=1
b+=(1,2,3)
b++=Array(8,3,5)
insert/remove/trimEnd
b.toArray
for if yield <===> filter map
与java转换 scala.collection.JavaConversions
```
4. scaladoc
```
[B>:A] B只能是A的超类
```
5. map,tuple
```
val scores=Map("a"->10,"b"->3)
scala.collection.mutalbe.Map("a"->10,"b"->3)
Map(("a",10),("b",3))
取值
scores("a") //返回10
scores.contains("a") //判断是否有key
scores.getOrElse("a",0)
scores.get("a") //返回Option对象
更新
scores("a")=3
keySet,values
toMap //对偶的集合转成map
```
6. class
```
主要构造器执行类体中所有语句
辅助构造器 this 必须先调用主构造器或其它构造器
@BeanProperty val name:String=_ 生成4个方法
类中字段自动带有getter,setter方法,比如age的age,age_=
private[this] var a=0 //不生成set,get方法 不能用.a访问
```
7. object
```
apply 构造伴生类的新实例
```
8. package
9. 继承
```
非抽象方法 一定要 override
super 引用 超类与java一样
asInstanceOf[x] 类型检查
scala构造器中不能super(params)
```
10. file,Regex
```
import scala.io.Source
val source=Source.fromFile("a.txt","UTF-8")
val iter=source.buffered //放回处理
Source.fromFile().getLines.toArray
Source.fromFile().mkString
java的Printwriter写入文件
Source.fromURL()
Source.fromString("dfa")
Source.stdin
```
* 读取二进制文件
```
val file=new File(fileName)
val in=new FileInputStream(file)
val bytes=new Array[Byte](file.length.toInt)
in.read(bytes)
in.close
```
* 写入文件文件
```
val out=new PrintWriter("a.txt")
for(i<- 1 to 100) out.println(i)
out.close()
```
* 访问目录
```
implicit def makeFileVisitor(f: (Path) => Unit) = new SimpleFileVisitor[Path] {
override def visitFile(p: Path, attrs: attribute.BasicFileAttributes) = {
f(p)
FileVisitResult.CONTINUE
}
}
Files.walkFileTree(file.toPath, (f: Path) => println(f))
```
* 进程控制
```
import sys.process._
"ls -al .." !
"ls -al .." #! "grep sec" !
要把输出重定向到文件,使用撑#>操作符:
"ls -al .." #> new File("output.txt") !
要追加到文件末尾而不是从头覆盖的话,使用#>>操作符:
"ls -al .." #>> new File ("output.txt") !
要把某个文件的内容作为输入,使用#<操作符:
"grep sec" #< new File("output.txt") !
你还可以从URL重定向输入:
"grep Scala" #< new URL( http://horstmann. com/index.html ) !
```
* 正则
```
val wsnumwsPattern = """\s+[0-9]+\s+""".r
如果你想要从多个匹配项中提取分组内容,可以像这样使用for语句:
for (numitemPattern (num,item) <- numitemPattern.findAllln("99 bottles, 98 bottles"))
```
11. trait
* 扩展用extends,重写不用写override
* with Cloneable 所有java接口都可作trait使用
* 可发扩展类
* 自身类型
* this:类型=> 只能混入 类型的子类
* this:{def getMessage():String}=> 只能混入拥有getMessage方法的类
12. 操作符
* apply/update
* 提取器 :带unapply方法的对象
* unapplySeq方法 :提取任意长度的值的序列
13. 高阶函数
* val fun = ceil _ // _ 表示 不要参数 ,将ceil 转成函数
* map,foreach,filter,reduceLeft
14. 集合
* 扩展自Iterable
* LinkedHashSet保留插入顺序
* +加入无次序集合中,+:和:+ 向前或向后追加到序列;++ ,- --类似
* Seq,Set,Map
* IndexedSeq 可用下标访问,ArrayBuffer带,链表不带
* 都有apply方法
* #:: 构建stream
15. 模式匹配
* case a xx u=> // case xx(a,u) 中置表示法
* case 中 rest @ _* 匹配值绑定到变量
16. xml
* NodeSeq
* RuleTransformer,RewirteRule
17. 类型参数
* 上界 T<:Comparable[T] T 要是Comparable[T] 的子类
* 下界 >:
* a <% b 视图界定 : a 可以被隐式转换成b
* [T : Ordering] 上下文界定 要存在一个Ordering[T]的隐式值
* 类型约束
* =:=
* <:<
* <%<
* 型变
* +T 协变 适于 输出类型参数 如不可变集合中元素
* -T 逆变 适行输入类型参数 如 函数参数
18. 高级类型
* 类型投影 O#I
* this.type 链式调用 返回类型 解决返回 this 是父类问题
* Title.type 单例对象
* type a=b 别名
* 结构类型 def dothing(target:{ def do2(str:string):Any }) 任意有do2 的类都可调用dothing
* 复合类型
* 中置类型
* 存在类型 forSome
* 自身类型 this:Exception 只能被混入Exception的子类
* 抽象类型
* 高等类型
19. 解析
20. actor
21. 隐式转换
* 隐式转换函数:implicit 定义单参数的函数
* 隐式参数:
22. 定界延续
* reset shift
* @cps