《programming in scala》study note 上

来源:互联网 发布:head设计模式不会java 编辑:程序博客网 时间:2024/06/03 05:59

  • 第2章 scala入门初探
    • 1 scala解释器
    • 2 变量定义
    • 3 函数定义
    • 4 scala脚本
  • 第3章 入门再探
    • 1使用类型参数化数组Array
    • 2 List
    • 3元祖tuple
    • 4 set和map
    • 5识别函数式风格
    • 6 从文件读取文本行
  • 第4章 类和对象
    • 1 类字段和方法
    • 3 Singleton对象
    • 4 Scala程序
    • 5 Application特质
  • 第5章 基本类型和操作
    • 9 富包装器
  • 第6章 函数式对象
    • 2 创建Rational
    • 4 检查先决条件

第2章 scala入门初探

2.1 scala解释器

  • scala的交互式shell就叫scala,直接在命令提示符里输入scala
 [root@bigdata ~]# scalaWelcome to Scala version 2.11.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_71).Type in expressions to have them evaluated.Type :help for more information.scala>

2.2 变量定义

  • Scala有两种变量,val和var。val一旦初始化了就不能再被赋值,var可以再它的生命周期中被多次赋值。

2.3 函数定义

这里写图片描述

2.4 scala脚本

$scala hello.scala
  • 使用scala 命令执行脚本,脚本内容无需完整的main函数,类似命令式编程即可,而使用scalac去编译则需要加上完整的包名和Main函数。

第3章 入门再探

3.1使用类型参数化数组(Array)

  • 定义
val greetStrings= new Array[String](3)greetStrings(0)="Hello"greetStrings(1)=","greetStrings(2)="world!\n"for(i<-0 to 2)    print(greetStrings(i))
  • 如果用变量val定义数组,greetStrings对象不能被重新赋值成别的数组;它将永远指向初始化指定的那个Array[String]实例,但是Array[String]的内部元素始终能被修改,因此数组本身是可变的。
  • 本例to实际上是仅带一个Int参数的方法。代码0 to 2被转换成方法调用(0).to(2)
  • scala没有操作符重载都是方法调用
    Scala所有的操作符都是方法调用
  • 任何参数值都将转换成apply方法的调用。greetStrings(i)转换成greetStrings.apply(i)
    greetStrings(0)=”Hello”被转换成:greetStrings.update(0,”Hello”)

3.2 List

  • Scala的list一旦创建了就不可改变。
  • :::方法实现了List叠加,将返回新的值
val oneTwo = List(1,2)val threeFour=List(3,4)val oneTwoThreeFour= oneTwo ::: threeFour
  • list常用的操作符或许是::,它可以把新元素组合到现用列表的最前端,然后返回作为执行结果的新列表。
val twoThree=List(2,3)val oneTowThree=1::twoThreeprintln(oneTwoThree)将得到List(1,2,3)
  • 1::twoThree中::是右操作符,可以改写成twoThree.::(1)
  • 不支持append操作,因为随着列表变长,append耗时将呈线性增长,而使用::做前缀,仅耗用固定的时间
    这里写图片描述
    这里写图片描述
    这里写图片描述

3.3元祖tuple

  • 跟list一样元祖也是不可变的
val pair = (99,"hello")println(pair._1)println(pair._2)

3.4 set和map

  • set和map通过继承的差别可以实现可变和不可变。
    这里写图片描述
    这里写图片描述
  • scala中创建set的方法与创建list和array类似,通过调用set伴生对象的apply工厂方法返回set实例
  • mutable和Immutable都提供了+方法,但结果不同。对于mutable才是真正的+=方法,而immutable将产生一个全新的集,等价于jetSet=jetSet+”Lear”
  • 默认是immutable,使用mutalbe要进行导入import scala.collection.mutable.Set
  • map里面有一个基础map特质和两个子特质Map
    这里写图片描述
    这里写图片描述
  • scala编译器把二元操作符表达式1->”Go to island”转换为(1).->(“Go to island.”)

3.5识别函数式风格

  • scala允许指令式编程风格但鼓励采用函数式风格,java属于指令式风格。如果代码包含了任何var变量,那它可能就是指令式风格。如果代码根本没有var,就是说仅仅包含val那它或许是函数式的风格。
  • 减少使用var重构后的代码比指令式的代码更简洁,明白,也更少有机会犯错。
  • scala程序员的平衡感,崇尚val,不可变对象和没有副作用的方法。

3.6 从文件读取文本行

这里写图片描述
这里写图片描述

第4章 类和对象

4.1 类、字段和方法

  • 保持对象健壮性的重要方法之一就是保证对象的状态–即实例变量的值–在对象整个生命周期中持续有效。第一步就是通过把字段变为私有的以阻止外界直接对它的访问。
  • 传递给方法的任何参数都可以在方法内部使用。scala里方法参数的一个重要特征是它们都是val,不是var.
    这里写图片描述
  • 如果去掉等号那么方法结果类型就必定是Unit,scala可以把任何类型转换为Unit。例如如果方法的最后结果是String,但结果类型被声明为Unit那么Sring将被转换为Unit并被丢弃原值
scala> def f():Unit = "this String gets lost"             f: ()Unit

对于想返回非Unit值的方法却忘记加等号时,错误就出现了。所以为了得到想要的结果,等号是必不可少的。

scala> def f() = "this String gets lost"             f: ()java.lang.String

4.3 Singleton对象

  • object定义的为单列对象,当单列对象与某个类共享同一个名称时,称为这个类的伴生对象(companion object)。类和它的伴生对象可以互相访问其私有成员。
  • 类和单列对象的差别是,单列对象不带参数,而类可以。因为单列对象不是用new关键字实例化的,所以没有机会传递给它实例化参数。
  • 每个单例对象都被实现为虚构类(synthetic class)的实例,并指向静态的变量,因此与Java静态类有着相同的初始化语义。特别要指出的是,单列对象在第一次访问的时候才会被初始化。

4.4 Scala程序

  • java需要你把公共类放在以这个类命名的原文件中,而scala没有硬性规定。通常情况下如果不是脚本,推荐的风格像在java里那样按照所有包含的类名来命名文件。

4.5 Application特质

这里写图片描述

  • Application声明了带有合适签名的main方法,并被你写的单列对象继承,比编写完整的mian要简单,不过也有缺点第一想要访问命令行参数的话就不能用它,第二因为某些JVM线程模型的局限,如对于多线程的程序需要自行编写main方法;最后某些JVM的实现没有优化被Application特制执行的对象的初始化代码。因此只有当程序相对简单并且是单线程的情况下才可以继承Application特制。

第5章 基本类型和操作

5.9 富包装器

  • 每个基本类型都对应着一个”富包装器“提供额外的方法。
    这里写图片描述

第6章 函数式对象

6.2 、创建Rational

  • 不可变对象的权衡
    不可变对象提供了若干强于可变对象的优点和一个潜在的缺点。首先,不可变对象常常比可变对象更易理清头绪,因为它们没有会随着时间变化的复杂状态空间。其次,你可以很自由地传递不可变对象,但对于可变对象来说,传递给他代码之前,需要先建造个以防万一的副本。第三,一旦不可变对象完成构造之后,就不会有线程因为并发访问破坏对象内部状态,因为根本没有线程可以改变不可变对象的状态。第四,不可变对象让哈希表键值更安全。比方说,如果可变对象在进入HashSet之后被改变,那么你下一次查找这个HashSet时就找不到这个对象了。不可变对象唯一的缺点就是有时需要复制很大的对象表而可变对象可以在原址发生。有些情况下这会变得难以快速完成而可能产生性能瓶颈。

6.4 检查先决条件

class Rational(n:Int, d:Int){    require(d!=0)    override def toString=n+"\"+d}
  • 如果d=0则抛出llegalArgumentException异常
0 0
原创粉丝点击