Scala高阶函数介绍

 

Scala混合了面向对象和函数式的特性。在函数式编程语言中,函数是"头等公民",可以像其他任何数据类型一样被传递和操作。在函数式编程语言中,只需要将具体实现包在函数中作为参数传入即可。

 

 

作为值的函数

 

在变量中存放函数

// 将num值设置为3.14
    val num = 3.14
    // 将fun设置为函数
    // 注意:ceil _ 函数后面的 _ 意味着确实指的是函数,而不是碰巧忘记传参
    val fun = ceil _ // _把ceil方法转为函数,在Scala中方法无法直接操作,必须转为函数操作

    println(num)
    println(fun(2.4))

    // 下面是将 fun 作为参数传给另一个函数
    Array(3.14,1.42,2.0).map(fun).foreach(println)

 

 

匿名函数

 

在Scala中,你不需要给每一个函数命名,以下是一个匿名函数

// 该函数将参数乘以3
val newX = (x: Double) => 3 * x
Array(3.14, 1.42, 2.0).map(newX).foreach(print)

 

 

带函数参数的函数

 

// 由于 valueAtOneQuarter 是一个接收函数参数的函数,因此被称为高阶函数。
  def valueAtOneQuarter(f: (Double) => Double) = f(0.4)

 

 

常用的高阶函数

 

要熟悉和适应高阶函数,我们可以看看Scala库中常用的

(1 to 9).map(0.1 * _)

// 打印一个三角形
(1 to 9).map("*" * _).foreach(println)

// filter方法输出所有匹配某个特定条件的元素,
(1 to 9).filter(_ % 2 == 0).foreach(println)

// reduceLeft方法接收一个二元的函数--即一个带有两个参数的函数,并将它应用到序列中的所有元素中,
(1 to 9).reduceLeft(_ * _) // ==> 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9
// 具体实现就是 (...((1 * 2) * 3) * 4 ) ... * 9)

// sortWith 排序,根据每个元素的长度递增
val content = "Mary has a little lamb"
content.split(" ").sortWith(_.length < _.length).foreach(println)

 

 

闭包

 

在Scala中,你可以在任何作用域内定义函数,包、类甚至是另一个函数或方法。在函数内,你可以访问到相应作用域内的任何变量。注意:函数可以在变量不在处于作用域内时被调用。

// 我们先定义一个函数
def mulBy(factor: Double) = (x: Double) => {
  factor * x
}

// 第一次调用mulBy函数将参数factor设置为3,该变量在(x: Double) => { factor * x } 函数的函数体,
// 函数被存入triple,然后参数变量factor从运行时的栈上被弹出
val triple = mulBy(3)
// mulBy再次被调用, 将factor设置为0.5, 函数被存入half, 这样的函数就是闭包。
val half = mulBy(0.5)

println(triple(14) + " "+ half(14)) // ==> 42.0 7.0

 

 

柯里化

 

柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。

// 以下函数接受一个参数,生成另一个接受单个参数的函数,
// Scala中可以简写为 def mulOneAtATime(x:Int)(y:Int) = x * y
def mulOneAtATime(x: Int) = (y: Int) => x * y

// 可以通过以下调用来就按两个数的乘积
mulOneAtATime(4)(7)

 

Actor

 

/**
 * 创建HiActor1
 */
class HiActor1 extends Actor {

  def act() = {
    while (true) {
      receive {
        case "hi1" => {
          println("hello1")
        }
        case "F" => {
          println(".......")
        }
      }
    }
  }
}


/**
 * 创建HiActor2
 */
class HiActor2(hi1: Actor) extends Actor {

  def act() = {
    while (true) {
      receive {
        case "hi" => {
          println("hello2")
          hi1 ! "F"
        }
        case "other" => {
          println("other")
        }
      }
    }
  }
}


def main(args: Array[String]): Unit = {
  val hi1 = new HiActor1()
  val actor1 = hi1.start()
  val hi2 = new HiActor2(actor1)
  val actor2 = hi2.start()
  actor2 ! "hi"
}

 

 

 

长按识别图中二维码

关注获取更多资讯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值