Scala之偏函数
来源:互联网 发布:淘宝网店图片处理软件 编辑:程序博客网 时间:2024/05/22 16:03
偏函数是只对函数定义域的一个子集进行定义的函数。这知识点是难点,自己也没能很好理解怎么用,什么时候用 -_-!记得学线程的时候有个receive和react ,当时老师说这个是偏函数,也没懂什么意思。看源码 def receive[R](f : scala.PartialFunction[scala.Any, R]) : R = { /* compiled code */ } override def react(handler : scala.PartialFunction[scala.Any, scala.Unit]) : scala.Nothing = 这里的参数都是scala.PartialFunction类型的,泛型参数里第一个表示输入的类型,第二个表示输出的类型。其实在下面代码中
class HelloActor extends Actor{ override def act(): Unit = { while (true) { //receive从邮箱中获取一条消息 //然后传递给它的参数 //该参数是一个偏函数 receive { case "actorDemo" => println("receive....ActorDemo") } } }}
可以从上面图片中看出receive的参数是一个偏函数,输入参数是”actorDemo”,输出参数是Unit.可以理解case就是一个函数,经常有好多组case,如果一组case语句没有涵盖所有的情况,那么这组case语句就可以被看做是一个偏函数。
按我的理解,偏函数直接使用时像模式匹配,而偏函数作为参数传入时就难理解,更难应用。(以后再学怎么用),下面是自己写的代码,当作认识偏函数
package com.dt.scala.moguyun/** * 偏函数 * Created by hlf on 2016/8/10. */object PartialFunctionLearn { def main(args: Array[String]): Unit = { jump("hello") // jump(5)不是String直接报错 //因为加了其余情况时会输出,如果不加其余情况的匹配会报错: //Exception in thread "main" scala.MatchErro jump("love") println(run(5)) //定义时也可以用val来定义 val jump2: PartialFunction[String, Unit] = { case "hello" => println("fine, and you?") case "have a good day!" => println("the same to you!") // case 5 => println("why get me a Five?") case _ => println("what is this? get away from me!") } jump2("have a good day!") } /** * 定义一个偏函数,有两种方式定义偏函数,下面这种更好, * 因为有isDefinedAt方法来校验参数是否会得到处理. * 或者在调用时使用一个orElse方法,该方法接受另一个偏函数, * 用来定义当参数未被偏函数捕获时该怎么做 */ def jump: PartialFunction[String, Unit] = { case "hello" => println("fine, and you?") case "have a good day!" => println("the same to you!") // case 5 => println("why get me a Five?") case _ => println("what is this? get away from me!")//注释的话如果匹配不上会报错 } /** * 另一种定义一个偏函数的方式,不细说 */ def run = (x: Int) => x match { case x if x > 1 => 1 }}结果fine, and you?what is this? get away from me!1the same to you!
- 1
什么时候该使用偏函数?
当我们确定我们的程序不会被传入不可处理的值时,我们就可以使用偏函数。这样万一程序被传入了不应该被传入的值,程序自动抛出异常,而不需要我们手工编写代码去抛出异常,减少了我们的代码量。
看下面一个例子,判断数的奇偶:
package com.dt.spark.scala.bascisobject HelloPartionalFunction { def main(args: Array[String]): Unit = { val sample =1 to 10 val isEven:PartialFunction[Int,String]={ case x if x % 2 == 0 => x + "is even" } isEven(4) val evenNumbers = sample collect isEven evenNumbers.foreach { println } val isOdd:PartialFunction[Int,String]={ case x if x % 2 == 1 => x + "is Odd" } val numbers =sample map {isEven orElse isOdd} numbers.foreach { println } }}2is even4is even6is even8is even10is even1is Odd2is even3is Odd4is even5is Odd6is even7is Odd8is even9is Odd10is even
阅读全文
0 0
- Scala之偏函数
- Scala之偏函数Partial Function
- Scala之偏函数Partial Function
- Scala基础之函数
- scala学习之函数
- Scala基础知识之函数
- Scala入门之部分应用函数与偏函数
- Scala入门之部分应用函数与偏函数
- Scala之旅-函数详解
- Scala之主构造函数
- Scala之主构造函数
- Scala之高阶函数
- Scala之高阶函数
- Scala 之 高阶函数
- Scala入门之函数进阶
- Scala入门之函数编程
- scala学习笔记之函数
- Scala入门之函数编程
- Qt实例digitalclock详解
- 交换类排序(冒泡排序及快速排序)
- 第一章:Chrome 浏览器 搭建 selenium 环境
- linkurious.js实现Louvain社区发现算法
- Eclipse进入debug模式提示45s超时的解决办法
- Scala之偏函数
- python代码优化
- 中国科技发展得越快石英晶振的需求量就越大
- Mongodb 数据文件结构
- 总结一下js里面的关键字
- ubuntu 下终端关于调试C++的命令
- 【线段树区间单点更新加约束条件】HDU
- Ubuntu16.04+caffe+digits安装配置
- 【hdoj 5294】 Tricks Device 【最小割+最短路spfa】