@spiritnotes
2016-03-22T08:57:41.000000Z
字数 2685
阅读 1913
Scala
值保存的是特定类型的信息
val name:type = init
变量也是保存特定类型的信息,但是其可以修改
var name:type = init
语句用于改变状态,执行的是产生结果之外的操作
表达式用于表达,其会产生结果
Scala中一切都是表达式
语句块 {}
用Unit来表示不产生结果的结果类型
if else
操作符的顺序
组合表达式的结果是最后一个表达式的结果
多行表达式在REPL中使用:paste
方法将一组活动组合起来并赋予一个名字,是组织程序的最基本方式
def name(arg1:type1 ...):returntype = {
lines of code
result
}
方法体是一个表达式
对象上定义的特征就是你能够在对象的执行的操作,即是发送消息或调用方法。
class用以定义类
new用于创建对象
方法对类中的其他元素有特殊的访问方式。
import可以复用其他文件中的代码
import a.b,a.c
import a.{b,c}
import a.{b=>d,c=>e}
创建包
package
用scalac编译会形成类型包的目录
scalatest
域是构成对象的一部分的val或var,每个对象都会为其域获取自己的存储
遍历一个值序列,使用其中的每一个值执行某些操作
0 until 9
1 to 9
Range(1,10)
Range(1,10,2)
标准Scala包的一部分
val v = Vector(....)
v(9)
v.sorted / v.sort
v.head / v.tail
for (i <- v) ..
if else 可以直接返回值,不需要使用return
匹配表达式会将一个值与可能的选项进行匹配
value match {
case matchItem => expr
}
即是类主构造器的参数
支持可变元参数 (a:Int*)
创建具有参数的类的对象时,可以指定具体的参数名
缺省参数是指在定义时给出其缺省值
将相同的名字用于不同的方法,参数列表有区别
方法签名包括方法名、参数列表和返回值
重载提高了抽象的级别
构造器是构造新对象的代码
最简单形式:单行的类定义 class Bear
方法对类参数具有访问权限,无需传递参数
def this() = {
}
辅助构造器第一行必须首先调用主构造器
无需声明返回类型
有木有=号没有差别
辅构造器的参数前不能有val或var
当类基本上是一个数据保持器时,case类可以简化代码并执行公共的操作
字符串前面s,里面使用{code}
Vector[Int]
Scala会自动将函数提升为函数对象
匿名函数/字面函数: 移除def和名字,将=改为=>
函数编程
包含生成器、过滤器、定义赋值、yield
case i:Int => ..
case CaseClass(x, y)
消除中间结果, yield自动可以生成列表,不需要定义变量
删除不必要的大括号, 单个表达式
最好不要使用分号
移除不必要的参数 如foreach(println)
为返回类型使用类型推断
用type为名字取别名
无参数方法如果不改变对象,则默认不加括号
可以使用中缀表达式来调用单参数方法
case会创建toString
默认类会获得缺省的toString
手动自定义需要 override
创建 (a,v,b)
拆包 val (a,v,b) = f
f._1
object将逻辑上紧密关联但是无需多个实例的方法和域收集在一起
设置一个实例计数器,object中定义一个变量
工厂方法:伴生对象中的apply
使用extends关键字基于现有类创建一个新类
继承的类必须通过基类构造器对其进行初始化,除非基类没有构造器
override
Enumeration
abstract定义抽象类,包含未定义的方法或域
trait
val可以替换def
def可以替换var
复用大量Java编写的类
reflect.runtime.currentMirror.reflcet(0).symbol
is A的关系
优先选择组合而不是继承
优先使用特征而不是更具体的类型(更抽象==更灵活)
将模型划分成互相独立的部分
延迟具体化
sealed trait 。。。
case object 。。。 extends 。。。
object A extends Enumeration{
case class _Val() extends val with B
type A = _Val
val C,D,E = _Val()
}
一般情况下选择vector
List针对递归做了优化
zipWithIndex
set_(9) 判断元素是否位于集中
Mpa
val、var控制的是变量是否可以更改绑定到另外的对象
可修改性是指的一个对象是否可以修改状态
| 或逻辑
异常处理器
构造器中的失败怎么处理
与Option类似, 有 Left 和 Right
Try{。。。} 会捕获异常并,正确返回Success对象,异常返回Failure对象
.revover方法将异常转换,正常结果正常穿过
Try(..).recover{case e:Throwable => e.getMessage}.get
.transform将分别对成功和失败两个方向产生转换
.getOrElse
Catch对象 .tryCatch(...)
Failure类会创建栈轨迹,其负担很重
require 查看方法参数
assume
java.util.logging
扩展方法通过隐式类实现 implicit class .... { ... }
使用AnyVal不会额外创建对象 implicit class AnyName(val s:String) extends AnyVal {....}
使用 trait x[s]{...} 以及柯里化和隐式对象简化代码