Scala 学习笔记

一、Scala 基础

  1. 变量
  1. 定义方法和函数

定义方法

def func(x: Int, y: Int) = x + y

定义函数

val fun = (x: Int, y: Int) => x + y

// 另外一种写法
val fun: (Int, Int) => Int = (x: Int, y: Int) => x + y

3. apply 方法

通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,...参数n)时apply方法会被调用

object ApplyDemo {
  def main(args: Array[String]) {
    //调用了Array伴生对象的apply方法
    //def apply(x: Int, xs: Int*): Array[Int]
    //arr1中只有一个元素5
    val arr1 = Array(5)
    println(arr1.toBuffer)

    //new了一个长度为5的array,数组里面包含5个null
    var arr2 = new Array(5)
  }
}

4. option 类型

在 Scala 中 Option 类型样例类用来表示可能存在或也可能不存在的值(Option 的子类有 Some 和 None)。Some 包装了某个值,None 表示没有值

package cn.itcast.cases

object OptionDemo {
  def main(args: Array[String]) {
    val map = Map("a" -> 1, "b" -> 2)
    val v = map.get("b") match {
      case Some(i) => i
      case None => 0
    }
    println(v)
    //更好的方式
    val v1 = map.getOrElse("c", 0)
    println(v1)
  }
}

5. 偏函数

被包在花括号内没有 match 的一组 case 语句是一个偏函数,它是 PartialFunction[A, B] 的一个实例,A 代表参数类型,B 代表返回类型,常用作输入模式匹配

package cn.itcast.cases

object PartialFuncDemo  {

  def func1: PartialFunction[String, Int] = {
    case "one" => 1
    case "two" => 2
    case _ => -1
  }

  def func2(num: String) : Int = num match {
    case "one" => 1
    case "two" => 2
    case _ => -1
  }

  def main(args: Array[String]) {
    println(func1("one"))
    println(func2("one"))
  }
}

二、scala 高级特性

2.1 高阶函数

2.1.1 闭包

参考文章:https://www.cnblogs.com/moonandstar08/p/5240312.html

2.1.2 将方法转换成函数

在 Scala 中,方法和函数是不一样的,最本质的区别是函数可以做为参数传递到方法中
但是方法可以被转换成函数,神奇的下划线又出场了

//定义一个方法
def method(x: nt) = x * 3

//神奇的下划线将方法转换成了函数
val fun = method _

//将函数传入 map 中
arr.map(fun)

2.1.3 柯里化

柯里化指的是将原来接受两个参数的方法变成新的接受一个参数的方法的过程

例子:

object Kelihua {

  def main(args: Array[String]): Unit = {

    val triple = mul(3)
    val half = mul(0.5)

    //柯里化如果没有第二个参数,就要用 _ 占位
//    val triple = mul2(3)(_)
//    val half = mul2(0.5)(_)
    println(triple(14) + " " + half(14))

    // 闭包也可以使用柯里化的方法调用
    println(mul(3)(14))

  }
  // scala 的闭包
  def mul(factor: Double) = (x: Double) => factor * x

  // 柯里化的定义方式
  def mul2(factor: Double)(x: Double) = factor * x
}

2.2 隐式转换和隐式参数

2.2.1 作用

隐式的对类的方法进行增强,丰富现有类库的功能

2.2.2 隐式转换函数

是指那种以implicit关键字声明的带有单个参数的函数

举个例子

  1. 先定义一个类:
class Girl(val name: String, var faceValue: Int, var age: Int)
  1. 下面要对 Girl 类进行增强,使她具有排序的功能

做法一:使用视图界定,ViewBound,需要传入一个隐式的函数

class Choosen[T <% Ordered[T]] {

  def choose(x: T, y: T) = {
    if (x > y) x else y
  }
}
  1. 定义隐式方法,用来将 Girl 转换成 Ordered[Girl]
object MyPreDef {

  // 隐式方法
  implicit def girlToOrdered(g: Girl) = new Ordered[Girl] {
    override def compare(that: Girl) = {
      if (g.faceValue == that.faceValue) {
        g.age - that.age
      } else {
        g.faceValue - that.faceValue
      }
    }
  }
}
  1. 测试成功
object Choosen {

  def main(args: Array[String]): Unit = {
    // 导入隐式转换
    import MyPreDef._
    val ch = new Choosen[Girl]
    val g1 = new Girl("liuyan", 80, 23)
    val g2 = new Girl("JULIA", 100, 18)
    println(ch.choose(g1, g2).name)
  }
}

以上的例子还可以使用上下文界定实现,ContextBound,需要传入一个隐式的值

// 上下文界定
class Choosen[T : Ordering] {

  def select(x: T, y: T) = {
    val ord = implicitly[Ordering[T]]
    if(ord.gt(x, y)) x else y
  }
}

ContextBound 需要传入一个隐式值

implicit val grilToOrdering = new Ordering[Girl]{
    override def compare(x: Girl, y: Girl) = {
      if (x.faceValue == y.faceValue) {
        x.age - y.age
      } else {
        x.faceValue - y.faceValue
      }
    }
}

抽象成公共方法,并结合使用隐式参数来实现

class Choosen[T] {

  // 隐式参数,相当于ViewBound 视图界定
  def choose(x: T, y: T)(implicit ord: T => Ordered[T]) = {
    if (x > y) x else y
  }

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

推荐阅读更多精彩内容

  • scala学习笔记 第2章 变量和数据类型 基本数据 scala的核心数据为四种 :字面量、值、变量、类型 值使...
    485b1aca799e阅读 2,113评论 0 1
  • 大数据学院_腾讯大数据http://data.qq.com/academySpark是一个通用的并行计算框架,立足...
    葡萄喃喃呓语阅读 575评论 0 1
  • scala文档 包含内容 1基础 2控制结构和函数 3数组相关操作 4映射和元组 5类 6对象 7.包和引入(x)...
    zlcook阅读 996评论 0 3
  • 很多人常常有这样一种感觉,拼命去维护的自认为正确的东西,在现实里却不堪一击;努力去拼搏的自认为正确的方向,到头来却...
    秦广玲阅读 1,004评论 2 7
  • 新建maven工程: 在第一次使用idea时,如下图选择新建工程 如下图,选择maven工程,sdk通过new,选...
    牛马风情阅读 1,876评论 2 4