Scala入门笔记

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

Scala简介

Scala 是一门多范式的编程语言, 由Martin Odersky 于2001年基于Funnel的工作开始设计Scala并于2004年正式发布

  • Scala是一种纯面向对象的语言,每个值都是对象
  • Scala是一门多范式编程语言, 支持命令交互式, 函数式, 面向对象
  • 编译型高性能语言(静态)
  • 与Java无缝兼容, 可以使用任何Java库

代码风格

  1. 函数和变量以小驼峰命名
  2. 类和特质以大驼峰命名
  3. 常量使用全大写命名
  4. 一般使用两格缩进
  5. Scala大部分情况可以忽略语句末尾的分号

Scala变量

Scala中尽量避免使用变量, 函数式编程的一个重要特性是不可变性(不可变变量没有副作用)

  • Scala是静态类型语言, 但是不需要显式的指明变量类型, Scala采用类型推断(Type Inference)
//定义一个变量
var x = 0

// 定义
val y = 1

Scala基本类型和操作

String和值类型Byte, Short, Int, Long, Float, Double, Char, Boolean

  • Scala的操作符不是特殊的语言语法, 任何方法都可以是操作符
  • 操作符分为前缀, 中缀, 后缀
  • Scala中所有操作符都是方法调用
# 前缀
scala> (2.0).unary_-
res1: Double = -2.0

# 中缀
scala> x indexOf 'o'
res0: Int = 4

# 后缀
scala> val x = "Hello, World"
x: String = Hello, World
scala> x.toLowerCase
res0: String = hello, world
  • 中缀操作符的两个操作数, 一个在左一个在右
  • 前缀操作符方法名在操作符上加了unary_前缀(+, -, !, ~)
  • 后缀操作符是不用点或括号调用的不带任何参数的方法

算术操作符: +, -, *, /, %
关系, 逻辑和位操作: >, <, >=, <=, ==, !=, &&, ||, &, |, ^, ~(反码)
位移操作: <<, >>, >>>(无符号右移)

Scala函数

函数式语言的一个主要特征是, 函数是第一类结构

函数定义如下图:

函数定义
  • Unit 的结果类型指的是函数没有返回有用的值

函数式对象

object和class的区别在于: object关键字创建一个单例对象

  • 主构造器是类的唯一入口, 只有主构造器可以调用超类构造器
  • override关键字用于在重载父类的非抽象成员和成员函数
  • 同一个类内函数名相同而参数类型和个数不同的函数重载不需要override
class Rational (n: Int, d: Int) {

  //precondition
  require(d != 0)

  // 私有成员
  private val g = gcd(n.abs, d.abs)
  var numer: Int = n / g
  var denom: Int = d / g

  // auxiliary constructor, 相当于python中__init__构造函数
  def this(n: Int) = this(n, 1)
  // 函数重载
  override def toString = n + "/" + d;

  def add(other: Rational): Rational =
    new Rational(numer * other.denom + other.numer * denom, denom * other.denom)

  def -(other: Rational): Rational =
    new Rational(numer * other.denom - other.numer * denom, denom * other.denom)

  // 函数重载
  def -(i: Int): Rational =
    new Rational(numer - i * denom, denom)

  def *(other: Rational): Rational =
    new Rational(numer * other.numer, denom * other.denom)

  def lessThan(other: Rational): Boolean =
    this.numer * other.denom < other.numer * this.denom

  def max(other: Rational): Rational =
    if (lessThan(other)) other else this

  private def gcd(a: Int, b: Int): Int =
    if (b == 0) a else gcd(b, a % b)
}

var x = new Rational(1, 3);
var y = new Rational(5, 7);

println(x add y)
println(x * y)
println(x - 1)

// 隐式转换, 放在解释器方位内
implicit def intToRational(x: Int) = new Rational(x)
println(1 - x)

继承和多态

  • 继承
  • 多态和动态绑定特性

动态绑定的特性即父类指针可以指向子类对象, 通过父类指针调用成员方法时, 会查找实际所指向的对象, 然后调用对象的内的对应方法

val el: Element = new ArrayElement(Array("hello"))
val e2: ArrayElement = new LineElement("hello")

内建控制结构

表示式会产生一个值

  • Scala中if是能返回值的表达式, Scala中没有三元操作符, 但通过if (condition) var1 else var2 可以实现三元操作符的功能
  • while和do-while被称为循环, 不产生有意义的结果
  • Scala中for语句非常强大, for {子句} yield {循环体}
  • match表达式可以产生值, match远强大与其他语言中的switch, 而且不需要显示的声明break
  • 变量范围: 大括号引入了一个新的范围, 内部变量会遮盖同名的外部变量
  • 占位符语法
  • 函数文本(匿名函数, 类似于python中的lamda)
var filename = if (!args.isEmpty) args(0) else "default.txt"


var filesList = (new File(".")).listFiles
// i <- 1 to 4(包含4), i <- 1 until 4 (不包含4)
for (file <- filesList
     if file.isFile;
     if file.getName.endsWith(".scala"))  // 过滤器使用分号隔开
    println(file)
    
var firstArg = if(args.length > 0) args(0) else ""
// 任何种类的常量和其他都可以作为case
firstArg match {
    case "text" => println("text")
    case _ => println("default")
}

// 匿名函数的写法(lambda)
scala> var someNumbers = List(1, 2, 3, 4)
scala> someNumbers.filter(x => x % 2 == 0)

// 占位符语法
scala> someNumbers.filter(_ % 2 == 0)

// 偏函数 partial funciton
scala> def sum(a: Int, b: Int, c: Int) = a + b + c
scala> val a = sum(1, _: Int, 3)
scala> a(2)

// 变长参数(Array[String])
scala> def echo(args: String*) = for(arg <- args) println(arg)
scala> echo("one")
scala> echo("one", "two")


class DefaultConstructor ( name:String , age:Int){
  def this(name:String){
    /*自定义构造器,必需首先调用默认构造器*/
    this(name , 24) ; 
  }
  def show(){
    println( name + "-->" + age ) ;
  }
}

柯里化(carry)

// 普通函数
def sum(x: Int, y: Int) = x + y

// 柯里化函数
def sum(x: Int)(y: Int) = x + y

// 实际执行
def sum(x: Int) = (y: Int) => x + y

特质(trait)

特质就像带有具体方法的java接口

特质和抽象类的区别: 抽象类主要用于有明确的父子继承关系的类树, 而特质可以用于任何类

特质定义使用trait关键字

trait Person() {
    def detail() {
        println("I'm angry!")
    }
}

// 使用extends或with混入特质, 从特质继承的方法可以像从超类继承的方法使用
class Student extends Person with Boy {
}

数据结构

  • Python中常用list, tuple, set, dict
  • Scala对应的数据结构为List, Tuple[X], Set, Map(HashMap)
  • Scala中默认为不可变对象, 操作会生成一个新的对象

  • Scala采用java平台的包机制
  • 使用import来进行引用
package com.zhihu.antispam

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,062评论 9 118
  • [toc] 0 hello world or 1变量 val 定义 immutable variable var ...
    brother阿张阅读 281评论 0 0
  • 读《快学Scala 》一书的摘要 Scala 运行于JVM之上,拥有海量类库和工具,兼顾函数式编程和面向对象。 在...
    abel_cao阅读 1,248评论 0 8
  • 生活中我们最常说的是忙,没有时间!想看书时,没有时间;想陪家人时,没有时间;想去旅游时,没有时间;想要运动时,还是...
    莫莫queen阅读 134评论 0 0
  • 夏至未至的时节,从Suki老师《穿衣有道,品型识人》的小班课走出来,看着天色尚早,天气尚好,身后是意犹未尽的姑娘们...
    卿疯阅读 795评论 18 15