文档章节

Scala 函数

k
 kunping
发布于 2017/07/11 00:03
字数 678
阅读 33
收藏 0

1、Scala偏函数(PartialFunction)

    1.1 它之所以偏,是因为它并不处理所有可能的输入,而只处理那些能与至少一个case语句匹配的输入。在偏函数中,只能使用case语句,而整个函数必须用花括号包围。这与普通的函数字面量不同,普通的字面量既可以用花括号,也可以用圆括号包围。

    1.2 偏函数定义:def 函数名:PartialFunction[输入类型, 输出类型] = { case ... => ... }

    1.3 偏函数可以链式,如 pf1 orElse pf2 orElse pf3 ...如果pf1不匹配则匹配pf2,再不匹配则匹配pf3,以此类推。若都不满足,则抛出scala.MatchError。

  1.4 使用isDefinedAt(x: A): Boolean方法来判断测试特定的输入是否与偏函数匹配,避免scala.MatchError

    1.5 scala程序设计样例:

  def cat(s1:String)(s2:String) = s1 + s2

  /**
    * val hello = cat("Hello ")
    * hello("World")
    * 以上调用方式会抛出如下异常:
    * Error:(34, 18) missing argument list for method cat in object TestCase
    * Unapplied methods are only converted to functions when a function type is expected.
    * You can make this conversion explicit by writing `cat _` or `cat(_)(_)` instead of `cat`.
    */
    //调用方式1:
    val hello = cat("Hello ") _ //注意下划线(_)
    hello("World")  //Hello World
    //调用方式2:
    cat("Hello ")("World")  //Hello World

    1.6 Spark源码样例:

  /**
   * Process messages from [[RpcEndpointRef.send]] or [[RpcCallContext.reply)]]. If receiving a
   * unmatched message, [[SparkException]] will be thrown and sent to `onError`.
   */
  def receive: PartialFunction[Any, Unit] = {
    case _ => throw new SparkException(self + " does not implement 'receive'")
  }

  /**
   * Process messages from [[RpcEndpointRef.ask]]. If receiving a unmatched message,
   * [[SparkException]] will be thrown and sent to `onError`.
   */
  def receiveAndReply(context: RpcCallContext): PartialFunction[Any, Unit] = {
    case _ => context.sendFailure(new SparkException(self + " won't reply anything"))
  }

2、Curry化

    2.1 Curry讲一个带有多个参数的函数转换为一系列函数,每个函数都只有一个参数。

    2.2 Scala程序设计样例:

  //def cat(s1:String)(s2:String) = s1 + s2
  //上述函数改写为Curry
  def cat(s1:String) = (s2:String) => s1 + s2
  val hello = cat("Hello ") //注意此处没有下划线(_)
  hello("World")  //Hello World
  //调用方式2:
  cat("Hello ")("World")  //Hello World

3、函数参数的调用方式:call-by-value与call-by-name

    3.1 call-by-value:传给函数的参数是个值,如果是个表达式或者是另外一个参数函数,则要先计算出表达式的值或者是要先得到参数函数执行后的返回值

  /**
    * call-by-value
    * 不会输出begin...,直接抛出异常
    * @param p  注意函数参数的定义无(=>)
    */
  def callByValue(p:Boolean) = {
    println("begin...")
    p
    println("end...")
  }
  callByValue(1 / 0 == 0)

    3.2 call-by-name:传给函数方法的参数是另外一个参数函数,该参数函数在函数体内调用时执行

  /**
    * call-by-name
    * 会先输出begin...,在抛出异常
    * @param p  注意函数参数的定义有一个(=>)
    */
  def callByName(p: => Boolean) = {
    println("begin...")
    p
    println("end...")
  }
  callByName(1 / 0 == 0
  
  //等效于
  def callByName(p:() => Boolean) = {
    println("begin...")
    p() //注意必须有圆括号
    println("end...")
  }
  callByName(() => 1 / 0 == 0)

 

© 著作权归作者所有

k
粉丝 3
博文 61
码字总数 29867
作品 0
深圳
私信 提问
在Scala中函数和方法有什么区别

方法可以作为一个表达式的一部分出现(调用函数并传参),但是方法(带参方法)不能作为最终的表达式, 但是函数可以作为最终的表达式出现: scala> //定义一个方法 scala> def m(x:Int) = ...

如风达
2015/08/28
1K
0
Scala之初步认识与环境准备

了解 Scala 1.1. 什么是 Scala Scala 是 Scalable Language 的简写,是一门多范式的编程语言。 Scala设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟...

飞鱼说编程
2018/12/19
31
0
Scala Functions vs Methods

写在开头,今年不经意间接触到了scala语言,以前一直在使用java语言,现在对scala比较有兴趣,最近用业余时间在学习这方面知识,已经看完《快学scala》正在看《scala编程》,这边文章是我在其...

-悟空-
2015/07/12
435
0
写给Java程序员的Scala入门教程

(原文链接:http://www.yangbajing.me/2016/07/24/写给java程序员的scala入门教程/,转载请注明) 之前因为Spark的引入,写了一篇《写给Python程序员的Scala入门教程》。那篇文章简单对比了...

羊八井
2016/07/25
4.3K
20
编程语言 Scala 2.12.0-M1 发布

Scala 2.12.0-M1 发布,Scala 2.12 系列的目标是 Java 8。 下载:scala-lang.org Maven Central Scala 2.12 改进计划: Java 8 style closures. Lambda syntax for SAM types New backend a......

oschina
2015/05/10
2.7K
16

没有更多内容

加载失败,请刷新页面

加载更多

还为PDF转Word抓狂?以下神器让你在职场倍受欢迎!

身在职场的你,是否一直在琢磨:如何能让自己在公司更受欢迎?如何才能在办公室里混个好人缘?如何在同事圈里留个好印象?其实,想要让自己成为受欢迎的人,只要让自己成为大家需要的人不就行...

foxit2world
20分钟前
7
0
AndServer+Service打造Android服务器实现so文件调用

so 文件调用 随着 Android 移动安全的高速发展,不管是为了执行效率还是程序的安全性等,关键代码下沉 native 层已成为基本操作。 native 层的开发就是通指的 JNI/NDK 开发,通过 JNI 可以实...

夜幕NightTeam
22分钟前
4
0
Docker下kafka学习三部曲之二:本地环境搭建

在上一章《 Docker下kafka学习,三部曲之一:极速体验kafka》中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来学习如何编写...

程序员欣宸
22分钟前
4
0
萌新推荐!不再为Excel转换PDF发愁,Aspose.Cells for .NET一步到位!

Aspose.Cells for .NET(点击下载)是Excel电子表格编程API,可加快电子表格管理和处理任务,支持构建具有生成,修改,转换,呈现和打印电子表格功能的跨平台应用程序。 将Excel工作簿转换为...

mnrssj
23分钟前
6
0
对于绘画小白怎么画制服?该注意什么?

怎样制作学生服装?想必绘画初学者们常常会想的问题吧,不知道怎样才能画好人物的衣服,别着急,今日就在这儿讲一些关于如何绘画学生衣服校服的教程给我们!期望能够帮到你们! 轻便西装是不...

热爱画画的我
28分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部