四时宝库

程序员的知识宝库

scala 入门(scala入门教程)

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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接