Scala语法(一)

Scala语法(一)

主要内容

变量与常用类型 控制结构 函数 类与对象 继承与特质 集合 模式匹配与样式类

1.变量

var val BigInt类型和BigDecimal可以直接使用运算符

2.控制结构与函数

块表达式赋值

var x = { val dx = x - x0; val dy = y - y0; dx*dy}

增强for与for推导式

1 to n(包含n) 和 1 until n (不包含n)

//守卫
for(i<- 1 to 3; j<- 1 to 3 if i!=j) print((10*i+j)+" ")

for推导式 for循环以yield开始 循环构造出一个集合 每次迭代返回集合的一个对象

for(i<- 1 to 10) yield i%3

3.函数

sum(1 to 5 :_*) 参数序列化

延迟加载 第一次使用的时候再加载

lazy val words = scala.io.Source.fromFile("").mkString

4.数组

定长数组 变长数组

Array ArrayBuffer

var arr = new Array[Int](10)
var arrBuffer = new ArrayBuffer[Int](10)
or 
var arr = Array(123)
var arrBuffer = ArrayBuffer[Int]()

ArrayBuffer
arr.insert(index,ele)
arr.trimEnd(2)
arr += 1
arr += (1,2,3)  多个被括号包起来的元素
arr ++= ArrayBuffer(1,2,3,4) 追加一个集合

数组转换

toArray toBuffer

元组

映射

+=  添加多个关系  不存在就添加  存在就更新
-= 移除某个键值对

5.

1.类都有主构造器 它的参数直接成为类的字段 类的字段自动带有setter和getter方法

2.主构造器执行类体中所有的语句

3.用@BeanProperty注解生成JavaBean的getXxx/setXxx方法

4.辅助构造器是可选的,它们都叫做this


scala源文件可以有多个类

调用无参方法时或创建无参对象时 可以不写圆括号

默认约定 改值器 ()取值器 不用()

scala会为每个字段创建setter和getter方法

重写setter和getter方法 分别重写 age age_=

@BeanProperty 会生成JavaBean的setXxx和getXxx方法

name: String
name_=(new Value: String): Unit
getName(): String
setName(newValue: String): Unit

主构造器

类名后加参数

辅助构造器

  • 辅助构造器的名称都是this
  • 每一个辅助构造器都必须以一个对先前已经定义的其他辅助构造器或主构造器的调用开始。

单例对象 与 伴生对象

scala没有静态方法和字段

类可以有一个同名的伴生对象

用apply方法来构造伴生类的新实例

单例对象

伴生对象

apply方法


继承

关键字 extends 重写非抽象方法时必须用override

只有主构造器可以调用超类的构造器

字段重写

def只能重写另一个def

val只能重写另一个val或不带参数的def

var只能重写另一个抽象的val

抽象类

抽象字段 不需要使用abstract声明 不提供具体的值就行

抽象方法 不需要使用abstract声明 不提供方法的方法体就行

  • 与Java不同,不需要对抽象方法使用abstract关键字,只是省去了方法体

继承抽象类时 抽象字段必须提供具体的值 抽象方法必须被重写 并且不需要override



特质 trait

继承多个特质 先被执行的方法放在后面

特质中的方法不需要使用abstract声明 没有方法体的方法默认抽象

重写特质的抽象方法时不需要override 但是重写带有带有实现的方法时需要

特质中重写抽象方法,必须在方法上使用 abstract 及 override

带有特质的对象

在定义子类时可以使用不做任何实现的特质,在构造具体对象的时候混入一个更合适的实现


函数

闭包

  • 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
  • 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。

匿名函数

(x:Double) => 3 * x

柯里化

原本是两个参数的函数 变成返回带有一个参数的函数的过程 返回一个以第二个参数为参数的函数
def multy(x:Int,y:Int) => x*y
def multyOne(x:Int) => (y:Int)=>x*y

模式匹配与样式类

不会穿透

守卫

样例类 和 密封类

Option 存放可能不存在的值 比null更安全


集合

Iterable

序列 集 映射

所有的集合类都有可变和不可变版本

+ 将元素加入到集合 +: 向前追加到序列 :+ 向后追加到序列 ++将两个集合拼接在一起

列表 List

要么是Nil 要么是Head +一个列表

发布于 2019-07-22 15:26