[关闭]
@spiritnotes 2016-03-22T08:57:41.000000Z 字数 2685 阅读 1786

《Scala编程思想》

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,每个对象都会为其域获取自己的存储

for循环

遍历一个值序列,使用其中的每一个值执行某些操作
0 until 9
1 to 9
Range(1,10)
Range(1,10,2)

Vector

标准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类

当类基本上是一个数据保持器时,case类可以简化代码并执行公共的操作

字符串插值

字符串前面s,里面使用{code}

参数化类型

Vector[Int]

作为对象的函数

Scala会自动将函数提升为函数对象
匿名函数/字面函数: 移除def和名字,将=改为=>

map和reduce

函数编程

for推导

包含生成器、过滤器、定义赋值、yield

基于类型的模式匹配

case i:Int => ..

基于case类的模式匹配

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

统一访问方式和setter

val可以替换def
def可以替换var

衔接Java

复用大量Java编写的类

浅尝反射

reflect.runtime.currentMirror.reflcet(0).symbol

多态

is A的关系

组合

优先选择组合而不是继承

使用特征

优先使用特征而不是更具体的类型(更抽象==更灵活)
将模型划分成互相独立的部分
延迟具体化

标记特征和Case对象

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针对递归做了优化

将序列与zip相结合

zipWithIndex

set_(9) 判断元素是否位于集中

映射表

Mpa

引用与可修改性

val、var控制的是变量是否可以更改绑定到另外的对象
可修改性是指的一个对象是否可以修改状态

使用元组的模式匹配

| 或逻辑

用异常进行错误处理

异常处理器

构造器与异常

构造器中的失败怎么处理

使用Either进行错误报告

与Option类似, 有 Left 和 Right

用Option对“非任何值”进行处理

用Try来转换异常

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]{...} 以及柯里化和隐式对象简化代码

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注