Scala 函数

闭包

  • 如下 addMore 成为一个“闭包”。因为它引用到函数外面定义的变量。定义这个函数的过程,是将和这个自由变量捕获二构成一个封闭的函数。
scala> var more =1
more: Int = 1

scala> val addMore = (x:Int) => x + more
addMore: Int => Int = <function1>

scala> addMore (100)
res1: Int = 101

scala> more =  9999
more: Int = 9999

scala> addMore ( 10)
res2: Int = 10009

可变参数

  • Scala中使用 * 来知名该参数为重复参数
scala> def echo (args: Any *) =
     |   for (arg <- args) println(arg)
echo: (args: Any*)Unit

scala> val arr = Array("java","scala","python")
arr: Array[String] = Array(java,scala,python)

scala> echo ("Hello",123,true,arr)
Hello
123
true
[Ljava.lang.String;@2c282004
  • 若要只传入数组的值,可用以下方法
scala> echo(arr: _*)

命名参数

  • 顾名思义 就是在调用函数时,参数传入和函数定义刘表是一一对应,允许使用任意顺序。如下:
scala> def add(one: Double, two: Double) :Double = one + tow
add: (one: Double, two: Double) Double

scala> add(two=10, one=2)
res1: Double = 12.0

高阶函数

  • 函数的参数也可以是另一个函数
  val arr = Array("javaisgood", "thisscala", " 123456")

  def strMatcher(matcher: (String) => Boolean) = {
    for(str <- arr; if matcher(str))
      yield str
  }

  def strEnding(str: String) = strMatcher(_.endsWith(str))

  def strContaining(str: String) = strMatcher(_.contains(str))

  def strRegex(str: String) = strMatcher(_.matches(str))

柯里化函数

  • 柯里化是把接收多个参数变换成接收一个单一参数(最初函数的第一个参数)的函数,返回接收余下的参数而且返回结果的新函数的技术。
  // common function
  def add(x: Int, y: Int) = {
    println("x: " + x)
    println("y: " + y)
    x + y
  }

  //curry function
  def _add(x: Int)(y:Int) = {
    println("_x: " + x)
    println("_y: " + y)
    x + y
  }

  // split
  def first(x: Int) = (y: Int) => {
    println("__x: " + x)
    println("__y: " + y)
    x + y
  }
first: (x: Int)Int => Int
scala> val second=first(1)
second: Int => Int = <function1>

scala> second(2)
res1: Int = 3

scala> val onePlus = _add(1)_
onePlus: Int => Int = <function1>

  • 其中 _ 作为第二参数列表的占位符

Call By Name & Call By Value

Call by value(传值调用)
使用 (变量 :类型)
Call by name(传名调用)
使用 (变量 : => 类型)
注意 ":" 和 "=>"之间一定要有空格

  def main(args: Array[String]) {
    // testOne
    testCallByNameAndValue(1,testLoop(6))
    // testTwo
    testCallByNameAndValue(testLoop(6),1)
  }
  // x为传值调用,y为传名调用
  def testCallByNameAndValue(x: Int,y: => Int) = {
    println("scala")
    1
  }
  def testLoop(a: Int):Int = {
    for (i <- (0 until a)) println("Iteration" + i)
    1
  }
// results of execution
// testOne
scala
// testTwo
Iteration0
Iteration1
Iteration2
Iteration3
Iteration4
Iteration5
scala

总结:

Call By Value :无论方法是否使用该参数都要先将该参数的值计算出来再传入
Call By Name :只有在该参数被方法使用时才计算该参数的值

定义新的的控制结构

scala> def twice (op:Double => Double, x:Double) =op(op(x))
twice: (op: Double => Double, x: Double)Double

scala> twice(_ + 1, 5)
res0: Double = 7.0

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

推荐阅读更多精彩内容

  • 文 /巴隐人 文有一个小孩儿撒娇成性,在疯狂地打闹其父亲。其妈说:“你把爸爸打死了,你就没有爸爸...
    巴隐人阅读 240评论 0 1
  • 知识很多,就像茫茫无边的大海,只有坚持不懈,不断获取知识,才会成为有学问的人。光阴似箭,日月如梭。当停下脚...
    广南县126严孟艳阅读 1,046评论 3 1
  • 我找到了一个小岛,四季如春,并不只是气候。那时候啊,它像是个理想国。 后来我有了上岛的机会,可是同行的人太多,我无...
    JOYL阅读 225评论 0 0
  • 愿你接受身上所有的特质 既不构成自负 也不构成自卑 就那么从容、恬淡 愿你与他人始终平和相待 不至于过分热情 也不...
    秋风误阅读 226评论 0 3
  • 文/任俊杰 如果从1956年一路追随巴菲特,一定会惊呆于财富回报。但在计算时需要采取两种口径: 按伯克希尔每股净值...
    谢宇衡阅读 356评论 1 2