Scala中有一个很有用的traits叫PartialFunction,我看了下别人的翻译叫做偏函数,但是我觉得部分函数更加确切。 那么PartialFunction是做什么用的呢?...简单点说PartialFunction用在模式匹配中,是一个不完整的函数,它只实现了函数的部分功能,也就是列举了部分case的情况。...我们先看下PartialFunction的定义: trait PartialFunction[-A, +B] extends (A => B) { ......我们可以看到PartialFunction是一个trait,它继承自函数 (A => B), 这个函数有一个参数和一个返回值,在Scala中,该函数会被自动解析为Function1。...可以通过使用orElse关键字来合并成一个完整的Function。
一个case语句就是一个独立的匿名函数,如果有一组case语句的话,从效果上看,构建出的这个匿名函数会有多种不同的参数列表,每一个case对应一种参数列表,参数是case后面的变量声明,其值是通过模式匹配赋予的...实际上case语句组合与偏函数的用意是高度贴合的,所以使用case语句组合是最简单明智的选择,同样是上面的inc函数,换成case去写如下: scala> def inc: PartialFunction...从另一个角度思考,偏函数的逻辑是可以通过普通函数去实现的,只是偏函数是更为优雅的一种方式,同时偏函数特质PartialFunction的存在对调用方和实现方都是一种语义更加丰富的约定,比如collect...方法声明使用一个偏函数就暗含着它不太可能对每一个元素进行操作,它的返回结果仅仅是针对偏函数“感兴趣”的元素计算出来的 为什么偏函数只能有一个参数?...说到底,类型PartialFunction无非是为由一组case语句描述的函数字面量提供一个类型描述而已,case语句只接受一个参数,则偏函数的类型声明自然就只有一个参数。
String函数的apply()方法,从而返回转换后的值“one”。...偏函数则更进一步,将函数求解空间中各个分支也分离出来,形成可以被组合的偏函数。 偏函数中最常见的组合方法为orElse、andThen与compose。...这意味着函数之间的组合可以使用andThen与compose,偏函数也可以。...因为要将这些偏函数组合起来形成一个管道,这就要求被组合的偏函数其输入值与输出值必须支持可串接,即上一个偏函数的输出值会作为下一个偏函数的输入值。...在PartialFunction中,andThen方法返回的是一个名为AndThen的偏函数: trait PartialFunction[-A, +B] extends (A => B) { override
偏函数 偏函数(Partial Function),是一个数学概念它不是"函数"的一种, 它跟函数是平行的概念。...Scala中的Partia Function是一个Trait,其的类型为PartialFunction[A,B],其中接收一个类型为A的参数,返回一个类型为B的结果。...is 1 pf1的结果返回类型必须和pf2的参数传入类型必须一致,否则会报错。...1.4 applyOrElse applyOrElse:它接收2个参数,第一个是调用的参数,第二个是个回调函数。如果第一个调用的参数匹配,返回匹配的值,否则调用回调函数。...第二次onePF匹配2失败则触发回调函数,返回的是"Two"字符串。 2.
f 递归应用于节点及其子节点 2.4、foreachUp(f: BaseType => Unit): Unit 与 foreach 不同的是,foreach 先应用于 parent,再应用与 child...#lift:将 partial func 转换为一个返回 Option 结果的函数。...将 pf 函数应用于符合 pf 定义的节点(即 pf.lift(node)返回的 Option 不是 None )并都 add 到 ret = new collection.mutable.ArrayBuffer...[B] 以 Seq 形式返回 2.6、collectLeaves(): Seq[BaseType] 以 Seq 的形式返回 tree 的所有叶子节点 def collectFirst[B](pf: PartialFunction...f 应用于所有子节点(非递归,一般将递归操作放在调用该函数的地方)后该节点的 copy。
如果只传递几个参数并不是全部参数,那么将返回部分应用的函数。这样就可以方便地绑定一些参数,其余的参数可稍后填写补上。...trait PartialFunction[-A, +B] extends (A => B) { self => import PartialFunction._ def isDefinedAt...(x: A): Boolean def orElse[A1 : B](that: PartialFunction[A1, B1]): PartialFunction[A1,...B1] = new OrElse[A1, B1] (this, that) override def andThen[C](k: B => C): PartialFunction[A,...实现了toString,equals,copy和hashCode等方法 为了方便模式匹配,LogicalPlan、SparkPlan都是case类 7、case类的copy()方法 copy()方法返回当前对象的复制
我们可以把Stream IO处理过程想象成连成一串的电视信号处理盒子:每个盒子具备一项信号转换或者过滤功能,我们将一个盒子的输出端子接入另一个盒子的输入端子使信号可以经过一连串的处理过程最终输出我们要求的信号...另外,可以把两个Process的处理过程连接起来:一个Process处理完后接着处理另一个Process: 1 def ++(p2: Process[I,O]): Process[I,O] = //...iproc是个函数,而partialfunction是function的子类,因而可以这样写 7 case None => iproc(None) //没有输入元素,继续等...} 下面是一组Process的基本方法和组件: 1 object Process { 2 case class Halt[I,O]() extends Process[I,O] 3 case...iproc是个函数,而partialfunction是function的子类,因而可以这样写 58 case None => iproc(None) //没有输入元素,
alice, 20",会默认调用 unapply 方法(对象提取器),student 作为 unapply 方法的参数,unapply 方法将 student 对象的 name 和 age 属性提取出来,与...Student("alice", 15)) 中的属性值进行匹配 case 中对象的 unapply 方法(提取器)返回 Some,且所有属性均一致,才算匹配成功, 属性不一致,或返回 None,则匹配失败...偏函数也是函数的一种,通过偏函数我们可以方便的对输入参数做更精确的检查。...偏函数定义 val second: PartialFunction[List[Int], Option[Int]] = { case x :: y :: _ => Some(y) } second:偏函数名称...PartialFunction[List[Int], Option[Int]]: 偏函数类型 该偏函数的功能是返回输入的 List 集合的第二个元素 举个例子: object Test_PartialFunction
[BaseType, BaseType]): BaseType = { // 对当前节点,调用rule函数。...,根据返回的结果生成一个新的节点。...UnresolvedRelation-multipartIdentifier: Seq[TESTDATA2] UnresolvedRelation无子节点 Project、Filter、UnresolvedRelation与...主要通过AnalysisHelper 中的 resolveOperatorsUp(后序遍历的)方法: // 入参为rule,偏函数 def resolveOperatorsUp(rule: PartialFunction...UnresolvedRelation返回后,就会接着先后为Filter-->Project执行ResolveJoinStrategyHint规则,最后返回Project本身。
本篇作为scala快速入门系列的第三十一篇博客,为大家带来的是关于偏函数的内容。 ? ---- 偏函数 偏函数提供了简洁的语法,可以简化函数的定义。...配合集合的函数式编程,可以让代码更加优雅。...定义 偏函数被包在花括号内没有match的一组case语句是一个偏函数 偏函数是PartialFunction[A, B]的一个实例 – A代表输入参数类型 – B代表返回结果类型 示例一...定义一个偏函数,根据以下方式返回。
Supervise[T] def withTimers[T](factory: TimerScheduler[T] => Behavior[T]): Behavior[T] ... } 上面的构建函数除返回...Supervisor(Behavior.validateAsInitial(wrapped), strategy)(effectiveTag) } } 注意,Supervise.onFailure返回了...注意:构建函数的入参数也是Behavior[T],所以这些构造器可以一层层嵌套着使用。...再看看另一个Greeter: object Greeter { sealed trait Response case class Greeted(hello: String) extends...name, guardianBehavior, guardianProps, ActorSystemSetup.create(BootstrapSetup(config))) ... } 其中一个apply与akka-classic
柯里化函数 高阶函数 二者的联系与区别 方法主要用于类和对象,函数主要用于传参和返回值 函数是一个对象,可以赋值给一个变量 二者可以部分转化 01 方法的常用用法 在多数编程语言中,方法其实属于广义上的函数...,该方法的返回值均为空 方法体中的大括号:在Scala中,大括号意味着将一组执行语句囊括为一个整体,并称之为代码块,代码块的最后一行代码的执行结果即是该方法的返回结果 方法体中return:与Python...在如上的函数声明中,仍然实现的是两个整数相加的功能,其中各要素介绍如下: 函数参数即参数类型,用法与方法中类似 建立参数与返回值映射,个人认为这是Scala中函数的一个标志性符号,作用类似于方法中的=...| } val fun: PartialFunction[Int,Double] = PartialFunction[Int, Double]中,第一个Int表示输入参数为Int...实际上,将函数作为另一个函数的参数或者返回值,这一特性在Python中也是有所体现的。 03 二者的联系与区别 作为编程语言中常用的封装技巧,函数是必不可少的语法特性。
Netty上加了一层封装,为实现对Spark的定制开发,所以了解Spark中RPC的原理还是有必要的 Akka是一个异步的消息框架,所谓的异步,简言之就是消息发送方发送出消息,不用阻塞等待结果,接收方处理完返回结果即可...当我们调用RpcEnv中的setupEndpoint来注册一个endpoint到rpcEnv的时候,在NettyRpcEnv内部,会将该endpoint的名称与其本省的映射关系,rpcEndpoint与rpcEndpointRef...rpcEnv.endpointRef(this) } //处理来自RpcEndpointRef.send或者RpcCallContext.reply的消息 def receive: PartialFunction...RequestExecutors(appId, requestedTotal) => case KillExecutors(appId, executorIds) => } 定义了对需要回复的消息组的处理逻辑...conf: SparkConf, val securityMgr: SecurityManager) extends ThreadSafeRpcEndpoint with Logging { 与Master
*/ def seal(settings: RoutingSettings): ExceptionHandler } object ExceptionHandler { type PF = PartialFunction...ne null) handler.seal(settings) else ExceptionHandler.default(settings) } 简单来说ExceptionHandler类型就是一种PartialFunction...: trait ExceptionHandler extends PartialFunction[Throwable, Route] 因为ExceptionHandler就是PartialFunction...与RejectionHandler一样,最顶层的handler是通过Route.seal设置的: /** * "Seals" a route by wrapping it with default...handler ne null) handler.seal(settings) else ExceptionHandler.default(settings) 通过这个ExceptionHandler.seal函数设置了最顶层的
如果你也对 大数据与机器学习感兴趣,可以关注我的动态 https://blog.csdn.net/qq_35050438,让我们一起挖掘数据与人工智能的价值~ Scala函数之数组: Array方法...: ++ 合并数组 var c = Array(1,2,3) var b = Array(4,5,6) b++c ++: 合并数组 并将右边的类型作为最终结果返回 val a = List(...(1, 2, 3) println(a.count({x:Int => x > 2})) // count = 1 diff(that: collection.Seq[T]): Array[T] 返回当前数组与另一个数组比较后独一无二得元素...Map类型,每个key对应一个序列,下面代码实现的是,把小于3的数字放到一组,大于3的放到一组,返回Map[String,Array[Int]] val a = Array(1, 2, 3,4..."+x.mkString(","))) /** 第1组:1,2,3 第2组:4,5 */ hasDefiniteSize: Boolean 检测序列是否存在有限的长度,对应Stream这样的流数据,返回
Set[A] 合并两个集合 7 def drop(n: Int): Set[A]] 返回丢弃前n个元素新集合 8 def dropRight(n: Int): Set[A] 返回丢弃最后n个元素新集合...三、函数式编程 1、偏函数 在对符合某个条件,而不是所有情况 进行逻辑操作时,使用偏函数是一个不错的选择将包在大括号内的一组 case 语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的参数实施计算...偏函数在 Scala 中是一个特质 PartialFunction 1) 使用构建特质的实现类(使用的方式是 PartialFunction 的匿名子类) 2) PartialFunction...(function1) println(list2) } } 偏函数简化 scala // 方式1 def f2: PartialFunction[Any, Int] = { case...高阶函数可以返回一个匿名函数。
实际上BackoffSupervisor与定义了supervisorStrategy的Actor有所不同。我们应该把BackoffSupervisor看作是一个一体化的Actor。...BackoffSupervisor.getCurrentChild //要求supervisor返回当前子级Actor var innerChild: Option[ActorRef] = None...//返回的当前子级ActorRef val selectedChild = context.actorSelection("/user/parent/supervisor/innerChild...c.forward(msg) case None ⇒ context.system.deadLetters.forward(msg) } } } 在handleBackoff函数里可以找到这些消息的处理方式...) //resend message SupervisorStrategy.Restart } 在BackoffSupervisorDemo里先声明sendToParent函数
K, genValue: () => Future[V]): Future[V] Cache[K,V]是以K为键,一个()=> Future[V]为值的结构,也就是说我们需要把一个获取Future值的函数存在缓存里...cache函数是这样定义的; def cache[K](cache: Cache[K, RouteResult], keyer: PartialFunction[RequestContext, K]):...Directive0 这个函数返回Directive0, 可以直接对应 { ......RouteResult](cachingSettings) //Example keyer for non-authenticated GET requests val simpleKeyer: PartialFunction...> Boolean = // _.request.headers.exists(_.is(Authorization.lowercaseName)) val result: PartialFunction
这样的好处是可以使用很多 FP 语言都支持的尾递归优化或者叫尾递归消除,即递归调用时直接将函数的调用者传入到下一个递归函数中,并将当前函数弹出栈中,在最后一次递归调用完毕后直接返回传入的调用者处而不是返回上一次递归的调用处...高阶函数 High-Order Function 高阶函数指一个函数的参数是另一个函数,或者一个函数的返回值是另一个函数。...transformation 即转换操作,所有返回 Stream 对象的函数都是 transformation 操作,该操作不会立即执行,而是将执行步骤保存在 Stream 对象中。...定义一个偏函数 val isEven: PartialFunction[Int, String] = { case x if x !...val isOdd: PartialFunction[Int, String] = { case x if x % 2 !
因为FSM继承了Actor,所以它必须实现receive函数。...也可以包括状态转换处理函数TransitionHandler: type TransitionHandler = PartialFunction[(S, S), Unit] 最后,initialize...[State,State]后返回新的状态State。...这个using与State.using是不同的。...与become/unbecome相同,我们也可以在FSM里使用stashing。
领取专属 10元无门槛券
手把手带您无忧上云