`

Scala Partial Functions(偏函数)学习

 
阅读更多
如果你想定义一个函数,而让它只接受和处理其参数定义域范围内的子集,对于这个参数范围外的参数则抛出异常,这样的函数就是偏函数(顾名思异就是这个函数只处理传入来的部分参数)。

偏函数是个特质其的类型为PartialFunction[A,B],其中接收一个类型为A的参数,返回一个类型为B的结果。

其有个重要的函数就是:

def isDefinedAt(x: A): Boolean //作用是判断传入来的参数是否在这个偏函数所处理的范围内

定义一个普通的除法函数:

scala> val divide = (x : Int) => 100/x
divide: Int => Int = <function1>
输入参数0
scala> divide(0)
java.lang.ArithmeticException: / by zero
 

显然,当我们将0作为参数传入时会报错,一般的解决办法就是使用try/catch来捕捉异常或者对参数进行判断看其是否等于0;但是在Scala的偏函数中这些都已经封装好了,如下:将divide定义成一个偏函数()

val divide = new PartialFunction[Int,Int] {
def isDefinedAt(x: Int): Boolean = x != 0 //判断x是否等于0,当x = 0时抛出异常
def apply(x: Int): Int = 100/x
}  


但是,当偏函数与case语句结合起来就能使代码更简洁,如下:

val divide1 : PartialFunction[Int,Int] = {
case d : Int if d != 0 => 100/d //功能和上面的代码一样,这就是偏函数的强大之处,方便,简洁!!
} 


其实这代码就是对上面那段代码的封装,这里同样调用isDefinedAt方法

scala> divide1.isDefinedAt(0)
res1: Boolean = false
  
scala> divide1.isDefinedAt(10)
res2: Boolean = true 


再举个与case结合使用的例子:

val rs : PartialFunction[Int , String] = {
case 1 => "One"
case 2 => "Two"
case _ => "Other"
}

输出:

scala> rs(1)
res4: String = One
  
scala> rs(2)
res5: String = Two
  
scala> rs(100)
res6: String = Other


OrElse
OrElse方法可以将多个偏函数组合起来使用,结合起来的效果类似case语句,但是每个偏函数里又可以再使用case

scala> val or1 : PartialFunction[Int,String] = {case 1 => "One"}
or1: PartialFunction[Int,String] = <function1>
  
scala> val or2 : PartialFunction[Int,String] = {case 2 => "Two"}
or2: PartialFunction[Int,String] = <function1>
  
scala> val or_ : PartialFunction[Int,String] = {case _ => "Other"}
or_: PartialFunction[Int,String] = <function1>
  
scala> val or = or1 orElse or2 orElse or_ //使用orElse将多个偏结合起来
or: PartialFunction[Int,String] = <function1>
  
scala> or(1)
res7: String = One
  
scala> or(20)
res9: String = Other


orElse还可以直接连接case使用

scala> val orCase:(Int => String) = or1 orElse {case _ => "Other"}
orCase: Int => String = <function1>
  
scala> orCase(1)
res10: String = One
  
scala> orCase(10)
res11: String = Other

  

andThen
对函数的结果进行下一步的处理

scala> val at1 : PartialFunction[Int,String] = {case cs if cs == 1 => "One"}
at1: PartialFunction[Int,String] = <function1>
  
scala> val at2 : PartialFunction[String,String] = {case cs if cs eq "One" => "The num is 1"}
at2: PartialFunction[String,String] = <function1>
  
scala> val num = at1 andThen at2
num: PartialFunction[Int,String] = <function1>
  
scala> num(1)
res18: String = The num is 1


注意:at1函数的结果返回类型必须和at2函数的参数传入类型一致,不然会编译报错

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Scala函数式编程

     这本书所讲授的,正是基于 Scala 的函数式编程基础。基于 Scheme、Haskell 等老牌函数式语言的传统教材的问题在于,相关语言的语法和思维方式与读者现有的知识体系迥异,容易造成较为陡峭的入门门槛。此外,由于...

    function programming in scala 英文原版 scala函数式编程

    英文原版 scala函数式编程 function programming in scala

    Scala编程详解 第5讲-Scala编程详解:函数入门 共5页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    scala的偏函数

    偏函数是PartialFunction[A, B]的一个实例 A代表输入参数类型 B代表返回结果类型 示例一 示例说明 定义一个偏函数,根据以下方式返回 参考代码 // func1是一个输入参数为Int类型,返回值为String类型的偏函数 val ...

    Scala编程详解 第16讲-Scala编程详解:函数式编程 共14页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    Scala编程详解 第17讲-Scala编程详解:函数式编程之集合操作 共9页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    Scala编程详解 第7讲-Scala编程详解:函数入门之变长参数 共4页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    Scala编程详解 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    Scala是一种静态类型的函数式编程语言,而Spark是一个分布式计算框架,尤其适合于大数据处理和分析。本教程将深入探讨这两者如何结合,实现高效的大数据分析、数据流处理以及机器学习任务。 首先,让我们来理解...

    jacksu#utils4s#偏函数(PartialFunction)、偏应用函数(Partial Applied Functi

    scala中用scala.PartialFunction[-T, +S]类来表示scala可以通过模式匹配来定义偏函数, 下面这两种方式定义的函数, 都可以认为

    高阶函数 in Scala

    详细讲解Scala中的高阶函数部分,具体实例剖析Scala中高阶函数的意义所在,对控制抽象进行了详细的说明,参考书籍《快学Scala》、《Programming in Scala》

    第5讲-Scala编程详解:函数入门.rar

    理解Scala中的函数对于深入学习Scala至关重要,因为函数式编程是Scala的核心特性之一。通过掌握这些基础,你将能够更有效地利用Scala进行复杂问题的解决和软件开发。在实际编程过程中,还可以探索高阶函数、闭包、...

    Scala函数式编程.pdf

    函数式编程(FP)是一种...《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。

    KinoMin#bigdata-learning-notes#scala部分应用函数与偏函数1

    一、部分应用函数 二、偏函数 一、部分应用函数 二、偏函数

    最好的scala学习 课件

    最后,"Scala进阶之路-part05-高级语法.pdf"将探讨Scala的一些高级特性,如类型推断、高阶函数、匿名函数、 currying、偏函数、类型系统(如类型别名、类型参数和类型成员)以及元编程。这部分内容将提升你的编程...

    学习scala好的项目

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...

    Scala脚本:函数式编程的实用指南

    Scala,作为一种将面向对象编程和函数式编程完美结合的语言,提供了强大的函数式编程特性。Scala的函数式编程(FP)不仅包括高阶函数、匿名函数、递归和模式匹配等,还提供了不可变数据结构和纯函数等核心概念。本文...

Global site tag (gtag.js) - Google Analytics