Scala学习笔记

Scala学习笔记

1

scala program
var capital = Map(
“US” -> “Washington”,
“France” -> “Paris”
)

capital += (“Japan” ->“Tokyo”)
println(capital(“France”))

2

是什么让Scala具有可扩展性?
可扩展性受到从语法细节到控件的抽象构造等许多因素的影响,
Scala的可扩展性:面向对象和函数式编程的组合

3

函数式编程的两种指导思想:
第一种理念:函数是头等值。在函数式语言中,函数也是值,与整数或字符串处于同一个地位。
函数可以被当做参数传递给其他函数,可以当做结果从函数中返回或保存在变量中。
第二种理念:程序的操作应该吧输入值映射为输出值而不是就地修改数据。
函数式编程第二种理念的另一种解释:方法不应该有任何副作用(side effect).
方法与其所在环境交流的唯一方式应该是获得参数和返回结果。
函数式语言鼓励使用不可变数据结构和指明透明的方法。

4

Scala特点:
函数是头等结构
兼容性
简介
高层抽象
高级的敬爱类型化

5

变量定义
Scala有两种变量,val和var。val类似于Java中的final变量。一旦初始化,
val就不能再被赋值。相反,var如同Java中的非final变量,可以在它的
生命周期中被多次赋值。

6

可以把 <- 符号理解为“其中”,如 for(arg <- args) 就读做“对于args中的arg”

7

Scala根本没有传统意义上的操作符,取而代之的是诸如+,-,*,/这样的字符,可以用来做方法名。
例如:1+2,实际是在Int对象1上调用名为+的方法,并把2当做参数传给它,即(1).+(2)

8

Scala中尽管数组在实例化之后长度固定,但它的元素值是可变的,所以说数组是可变的。
Scala中列表类(List)是不可变的同类对象序列。
Lst列表操作有::和:::等。
list.head list.tail list.last
list.mkString(",") list.reverse
list.sort((s,t) =>
s.charAt(0).toLowerCase < t…charAt(0).toLowerCase
)

9

Scala中的元组(Tuple)和列表一样,也是不可变的。但与列表不同,元组中可以包含不同类型的元素。
如果需要在方法里返回多个对象,Java里的做法是创建JavaBean可以包含多个返回值,Scala里可以仅
返回元组。而且做起来也很简单:只要把元组实例化需要的对象放在括号里,并用逗号分隔即可。元组实
例化之后,可以用点号、下划线和基于1的索引访问其中的元素。

10

Set
var scalaSet = (“Beijing”,“Shenzhen”)
scalaSet += “Hangzhou”
scalaSet.+= (“Guangzhou”)
scalaSet = scalaSet + “Shanghai”

11

scala的任何object都能调用 -> 方法,并返回包含键值对的二元组
任何object都能调用 -> 的机制被称为隐式转换
val normalMap = scala.collection.mutable.Map(1 -> “goodera”,2 -> “lin”)
normalMap.+= (3 -> “love”)
normalMap += (4 -> “forever”)
normalMap(5) = (“wonderful”)

12

如果代码包含了任何var变量,那么它可能就是指令式的风格。如果代码根本就没有var,即仅仅包含val,
那么它或许是函数式风格。因此,向函数式风格转变的方式之一,就是尝试不用任何var编程。

13

在Scala里把成员公开的方法是不显式地指定任何访问修饰符,public是scala的默认访问级别

14

Scala比Java更为面向对象的特点之一是Scala不能定义静态成员,而是代之以定义单例对象。单例对象除了用
object关键字替换class关键字以外,看上去和类的定义一致。
当单例对象与某个类共享同一个名称时,它被称为这个类的伴生对象(companion object)。类和它的伴生对象必须定义在一个
源文件里,类被称为是这个单例对象的伴生类(companion class)。类和它的伴生对象可以互相访问其私有成员。

15

Scala中的基本数据类型都可以写成字面量(literal),字面量就是直接写在代码里的常量值。
例如:val name = “goodera”

16

符号 + 是操作符,更确切地说,是中缀操作符
Scala里的操作符不是特殊的语法,任何方法都可以是操作符,到底是方法还是操作符取决于你任何使用它。例如:s.indexOf(‘o’),indexOf就不是操作符,
但如果写成 s indexOf ‘o’,那么indexOf就是操作符。

17

先决条件require()

class Rational(m:Int,n:Int){
require( n != 0)

}
require方法带一个布尔型参数,如果传入的值为真,require将正常返回。反之,require将抛出
IllegalArgumentExeception阻止对象被创建。

18

关键字this指向当前执行方法被调用的对象实例,或者如果使用在构造器里的话,就是正在被构造的对象实例。
例如:
def lessThan(that:Rational)=this.number * that.denom < that.number * this.denom
这里,this.number指向lessThan被调用的那个对象的分子。也可以去掉this前缀而只写number,两种写法意义相同。
下面是不能省略this的例子,在Rational类里添加max方法返回指定有理数和参数中的较大者:
def max(that:Rational) = {
if (this.lessThan(that)) that else this
}
这里,第一个this可写可不写,写成(lessThan(that))也是一样的,但第二个this表示当测试为假的时候的方法结果,
如果省略,什么都返回不了。

19

Scala内建的控制结构屈指可数,仅有if、while、for、try、match和函数调用而已,能够产生值。

20

发生器(generator)
file <- filename 被称为发生器(generator)的语法,可以实现遍历功能
发生器中可以添加过滤器,如果添加超过一个过滤器,if子句必须用分号分隔。
eg:
for(
file <- filename
if file.isFile;
if file.getName.endsWith(".scala")
) println(file)
如果愿意的话,可以使用花括号代替小括号包裹发生器和过滤器。使用花括号的好处是可以省略使用小括号时必须添加的分号。

21

匹配(match)表达式
scala的match表达式类似于其他语言中的switch语句,可以提供多个备选项。

val firstArg = if(!args.isEmpty) arg(0) else “”
方式一:
val firstEnd = firstArg math {
case “salt” => “pepper”
case “chips” => “sala”
case “eggs” => “bacon”
case _ => “others”
}
println(firstEnd)
方式二:
firstArg match {
case “salt” => println(“pepper”)
case “chips” => println(“sala”)
case “eggs” => println(“bacon”)
case _ => println(“others”)
}

22

不再使用break和continue

23

变量范围
Scala程序里所有的变量定义都存在有效作用范围(scope)。。最常见的情况如,花括号通常引入看看新的作用范围,
所以任何定义在花括号里的东西超出括号之后就脱离了范围。
例如:val a = 1
{
val a = 2
println(a)
}
println(a)

24

函数
val f = (_ : Int) + (_ : Int)
数据输出方式:
someNumber.foreach(println)
someNumber.foreach(println )
someNumber.foreach(println(
))
someNumber.foreach(e => println(e))

25

将函数传递给一个变量
def sum(a:Int,b:Int,c:Int) = a + b + c
val aa = sum _
a(2,4,6)
分析:名为a的变量指向一个函数值对象。这个函数值是由Scala编译器
依照部分应用函数表达式sum _,自动产生的类的一个实例。编译器产生的类
有一个apply方法带3个参数,Scala编译器把表达式a(2,4,6)翻译成对函数值的
apply方法的调用,即a.apply(2,4,6)

26

Scala的任何方法调用,如果确实只传入一个参数,就能可选地使用花括号替代小括号包围参数。
例如:
println(“Hello World!”)
可以写成:
println{“Hello World!”}
在传入一个参数时,可以用花括号替代小括号的机制,其目的是让客户程序员能写出包围在花括号内的函数
字面量,这可以让方法 调用感觉更像控制抽象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章