第23讲: Scala高阶函数实战详解

高阶函数主要有两种:

一、将一个函数当做另外一个函数的参数(即函数参数)

普通函数的定义语法如下:

def funName(para1:Type1,para2:Type2):Type = { do some things }

我们想象一下,如果将函数作为参数,那么函数的类型该怎么写呢?

函数的类型,其实就是输入输出的类型。

假设,我们需要将函数ceil作为参数,而ceil的定义如下

  def ceil(x: Double): Double  = java.lang.Math.ceil(x)

那我们可以用如下方法定义函数

    def valueForCeil(f:(Double)=>Double,value:Double)={
      f(value)
    }

f是参数名称,(Double)=>Double 是参数的类型。

我们该如何调用函数valueForCeil呢?

package com.dt.scala.hello
import scala.math._

object ScalaInAction {
    def valueForCeil(f:(Double)=>Double,value:Double)={
      f(value)
    }                                             //> valueForCeil: (f: Double => Double, value: Double)Double
    valueForCeil(ceil _, 0.25)                    //> res0: Double = 1.0
}

第一个参数传入ceil函数,要让编译器知道ceil是函数,必须使用偏函数的方式:ceil _

其实,我们可以看出valueForCeil的第一个参数,并不是非要传入函数ceil。只要函数的定义参数类型和返回值于ceil一样,就可以。

看如下例子:

package com.dt.scala.hello
import scala.math._

object ScalaInAction {
    def valueForCeil(f:(Double)=>Double,value:Double)={
      f(value)
    }                                             //> valueForCeil: (f: Double => Double, value: Double)Double
    valueForCeil(sqrt _, 0.25)                    //> res0: Double = 0.5
}

这样我们就能很容易理解函数参数啦~

二、返回值是函数的函数

这个函数也是一样,只要理解了返回值是类型一个匿名函数就行了。

如下:

    def addBy(factor:Int) = {
      (x:Double)=> factor + x
    }

(x:Double) 是返回函数的参数定义,返回类型由表达式 factor +x 来决定。如果表达式比较复杂,也可以如下写法

(x:Double)=> { do some things }

我们看看如何调用函数

package com.dt.scala.hello
import scala.math._

object ScalaInAction {
    def addBy(factor:Int) = {
      (x:Double)=> factor + x
    }                                             //> addBy: (factor: Int)Double => Double

    val addFive = addBy(5)                        //> addFive  : Double => Double = <function1>
    println(addFive(20))                          //> 25.0
}

scala中提供的很多函数都是高阶函数:

(1 to 9).map(x=>"*" * x).foreach(println)

map函数既是函数参数函数。

x=>"*" * x

就是一个匿名函数

如何函数就一个参数,那么可以简写成如下方式

(1 to 9).map("*" * _).foreach(println)
时间: 2024-10-06 09:23:50

第23讲: Scala高阶函数实战详解的相关文章

DT梦工厂 第24讲 scala中sam转换实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/dHz5JKJxurM/优酷:http://v.youku.com/v_show/id_

第24讲: Scala中SAM转换实战详解

SAM 是single  abstract method的缩写,就是一些接口只有单个抽象方法 假设我们需要做一个按钮,每当按下按钮时,后台记录一次点击次数.在Java中代码实现的方式如下: package com.dt.scala.func import javax.swing.JButton import java.awt.event.ActionListener import java.awt.event.ActionEvent import javax.swing.JFrame objec

scala入门-09 scala高阶函数

我们做spark开发 会使用很多spark的高阶函数 所以 今天我就在linux服务上使用scala高阶函数 声明一个List集合: List集合所在的包已经被预定义自动引入,所以此处就不需要在引入包了,这里直接使用List实例化对象,其实用List的object对象的apply方法 我们使用map函数把list中的每个值都乘以3: x表示l中每一个元素,map对l中的每一个元素进行遍历操作,由于List中只有一种类型的元素,所以我们在执行马屁操作的时候可以省略其类型,如下所示: List集合中

Scala 深入浅出实战经典 第60讲:Scala中隐式参数实战详解以及在Spark中的应用源码解析

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/IVN4EuFlmKk/优酷:http://v.youku.com/v_show/id_

Scala 深入浅出实战经典 第78讲:Type与Class实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/2vZ06RMcD6I/优酷:http://v.youku.com/v_show/id

Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/pR_4sY0cJLs/优酷:http://v.youku.com/v_show/id_

Scala 深入浅出实战经典 第57讲:Scala中Dependency Injection实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/5LnLNDBKvi8/优酷:http://v.youku.com/v_show/id_

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

第58讲:Scala中Abstract Types实战详解

package com.parllay.scala.type_parameterizitor import scala.io.{Source, BufferedSource} /** * Created by richard on 15-8-17. * 第58讲:Scala中Abstract Types实战详解 */ /** * scala里的类型,除了在定义class,trait,object时会产生类型, * 还可以通过type关键字来声明类型. type相当于声明一个类型别名: scala