快学Scala(12)--高阶函数
Posted paulingzhou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快学Scala(12)--高阶函数相关的知识,希望对你有一定的参考价值。
在函数式编程语言中,你只需要将明细动作包在函数当中作为参数传入即可。
作为值的函数
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
以上是关于快学Scala(12)--高阶函数的主要内容,如果未能解决你的问题,请参考以下文章