快学Scala(12)--高阶函数

Posted on 2017-04-04 21:16  paulingzhou  阅读(159)  评论(0编辑  收藏  举报

在函数式编程语言中,你只需要将明细动作包在函数当中作为参数传入即可。

作为值的函数

import scala.math._
class TestFun {
  val num = 3.14
  val fun = ceil _
}

  这段代码将num设为3.14,fun设为ceil函数。ceil函数后面的_意味着你确实指的是这个函数,而不是碰巧忘记了给他送参数

Array(3.14, 1.42, 2.0).map(fun)  //Array(4.0, 2.0, 2.0)

  map方法接受一个函数参数,将它应用到数组中的所有值,然后返回结果的数组。

匿名函数

val triple = (x: Double) => 3 * x  //def triple(x: Double) = 3 * x
Array(3.14, 1.42, 2.0).map((x: Double) => 3 * x)  //Array(3.14, 1.42, 2.0).map{ (x: Double) => 3 * x }

  在这里,使用匿名函数高速map方法:”将每个元素乘以3“

带函数参数的函数

def valueAtOneQuarter(f: (Double) => Double) = f(0.25)

  valueAtOneQuarter的类型为((Double) => Double) => Double

def mulBy(factor: Double) = (x: Double) => factor * x
val quintuple = mulBy(5)
quintuple(20)  //100

  mulBy函数的类型为(Double) => ((Double) => Double)

参数(类型)推断

在参数类型已知的情况下,可以简写参数类型

val fun = 3 * _              //错误:无法推断类型
val fun = 3 * (_: Double)        //OK
val fun: (Double) => Double = 3 * _  //OK,因为我们给出了fun的类型

一些有用的高阶函数

1. map:将一个函数应用到某个集合的所有元素并返回结果

2. foreach: 将函数应用到每个元素

3. filter: 输出所有匹配某个条件的元素

4. reduceLeft: 接受一个二元的函数,并将它从左到右应用到序列中的所有元素

(1 to 9).reduceLeft(_ * _)

  表示(...((1 * 2) * 3) * ... * 9)

5. sortWith: 二元函数,排序

闭包

def mulBy(factor: Double) = (x: Double) => factor * x
val triple  = mulBy(3)
val half = mulBy(0.5)
println(triple(14) + " " + half(14))    //将打印 42 7