第21讲: 偏函数(Partially applied function)实战详解

偏函数,也叫部分应用函数,就是调用的时候,只传入函数的部分参数。先举个例子就很容易明白了。

object PartialAppliedFunction {
  def main(args: Array[String]): Unit = {
    val part_sum = sum(1,_:Int,3)
    println(part_sum(2))
  }
  
  def sum(a:Int,b:Int,c:Int)=a+b+c
}

我们定义了一个函数sum,共有3个参数。 我们又定义了一个函数part_sum,它依赖于sum函数,但是只有部分的参数是用了占位符代替。那么当我们调用part_sum时,只需传入sum的未传入的参数即可。

及 part_sum(2) == sum(1,2,3)

这个就叫作部分应用函数。

我们知道,在scala中函数是一等公民,函数可以当成变量赋值给其他的变量或者函数。

那么我们看看如下语句

scala> def sum(a:Int,b:Int,c:Int)=a+b+c
sum: (a: Int, b: Int, c: Int)Int

scala> val sum3 = sum
<console>:11: error: missing arguments for method sum;
follow this method with `_‘ if you want to treat it as a partially applied function
       val sum3 = sum
                  ^

直接将一个函数名称赋值给另一个变量,是会报错的。

其实我们想做的是:

scala> val sum3 = sum(_:Int,_:Int,_:Int)
sum3: (Int, Int, Int) => Int = <function3>

Scala提供了一个简单的写法

scala> val sum3 = sum _
sum3: (Int, Int, Int) => Int = <function3>

就是部分应用函数的特殊情况,所有的参数都应用。

在视频中老师举了一个例子:

object PartialAppliedFunction {
  def main(args: Array[String]): Unit = {
    val data = List(1,2,3,4,5)
    data.foreach(println _)
  }
}

其中

data.foreach(println _)

也是部分应用函数,开始时怎么也想不明白。这不是参数占位的写法嘛。其实这段代码应该这样理解

data.foreach() 应该传入一个函数作为参数 。 而 println _ 和sum _ 是类似的写法。

参数占位应该是这样写:

data.foreach(println(_))
时间: 2024-10-29 19:08:51

第21讲: 偏函数(Partially applied function)实战详解的相关文章

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

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_

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

高阶函数主要有两种: 一.将一个函数当做另外一个函数的参数(即函数参数) 普通函数的定义语法如下: def funName(para1:Type1,para2:Type2):Type = { do some things } 我们想象一下,如果将函数作为参数,那么函数的类型该怎么写呢? 函数的类型,其实就是输入输出的类型. 假设,我们需要将函数ceil作为参数,而ceil的定义如下   def ceil(x: Double): Double  = java.lang.Math.ceil(x) 那

第78讲:Type与Class实战详解

今天来学习下type与class解析 让我们先来看看代码 import scala.reflect.runtime.universe._ class Sparktrait Hadoopobject Flinkclass Java{  class scala} object Type_Advanced {    def main(args:Array[String]){    println(typeOf[Spark])    println(classOf[Spark])        val

第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的Type与Class实战详解

学习了scala的Type与Class实战详解,在运行时是通过反射来得到的.但是scala不同. scala.reflect.runtime.universe._ type 类和type比较,type比class更具体.任何数据都有type.但是class是一种数据结构,或数据 结构的抽象. 更宏观.但type更具体. 打印类的type就是包名加类名,但是class打印时在前面得加class object的getClass是class 包名加类名加$.所以object是有具体的类的 object

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_

第131讲:Hadoop集群管理工具均衡器Balancer 实战详解学习笔记

第131讲:Hadoop集群管理工具均衡器Balancer 实战详解学习笔记 为什么需要均衡器呢? 随着集群运行,具体hdfs各个数据存储节点上的block可能分布得越来越不均衡,会导致运行作业时降低mapreduce的本地性. 分布式计算中精髓性的一名话:数据不动代码动.降低本地性对性能的影响是致使的,而且不能充分利用集群的资源,因为导致任务计算会集中在部分datanode上,更易导致故障. balancer是hadoop的一个守护进程.会将block从忙的datanode移动到闲的datan

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_