Java与Scala中的偏函数与偏应用函数的使用方法
偏函数
偏函数(Partial Function),是一个数学概念它不是"函数"的一种, 它跟函数是平行的概念。
Scala中的Partia Function是一个Trait,其的类型为PartialFunction[A,B],其中接收一个类型为A的参数,返回一个类型为B的结果。
例如:
val pf: PartialFunction[Int, String] = { case 1 => "One" case 2 => "Two" case 3 => "Three" case _ => "Other" } println(pf(1)) //One println(pf(2)) //Two println(pf(3)) //Three println(pf(4)) //Other
偏函数内部有一些方法,比如isDefinedAt、OrElse、 andThen、applyOrElse等等。
isDefinedAt
isDefinedAt : 这个函数的作用是判断传入来的参数是否在这个偏函数所处理的范围内。
刚才定义的pf来尝试使用isDefinedAt(),只要是数字都是正确的,因为有case _=>"Other"这一句。如果换成其他类型就会报错。
val pf: PartialFunction[Int, String] = { case 1 => "One" case 2 => "Two" case 3 => "Three" case _ => "Other" } println(pf.isDefinedAt(1)) //true println(pf.isDefinedAt(2)) //true println(pf.isDefinedAt(3)) //true println(pf.isDefinedAt(4)) //true println(pf.isDefinedAt("1")) /** * 类型不匹配 * type mismatch; * found : String("1") * required: Int * println(pf.isDefinedAt("1")) */
orElse
orElse : 将多个偏函数组合起来使用,效果类似case语句。
val onePF: PartialFunction[Int, String] = { case 1 => "One" } val twoPF: PartialFunction[Int, String] = { case 2 => "Two" } val threePF: PartialFunction[Int, String] = { case 3 => "Three" } val otherPF: PartialFunction[Int, String] = { case _ => "Other" } val newPF = onePF orElse twoPF orElse threePF orElse otherPF println(newPF(1)) //One println(newPF(2)) //Two println(newPF(3)) //Three println(newPF(4)) //Other
这样,newPF跟原先的pf效果是一样的。
andThen
andThen: 相当于方法的连续调用,比如g(f(x))。
pf1的结果返回类型必须和pf2的参数传入类型必须一致,否则会报错。
val pf1: PartialFunction[Int, String] = { case i if i == 1 => "One" } val pf2: PartialFunction[String, String] = { case str if str eq "One" => "The num is 1" } val num = pf1 andThen pf2 println(num(1)) //The num is 1
applyOrElse
applyOrElse:它接收2个参数,第一个是调用的参数,第二个是个回调函数。如果第一个调用的参数匹配,返回匹配的值,否则调用回调函数。
val pf: PartialFunction[Int, String] = { case 1 => "One" } println(pf.applyOrElse(1, { num: Int => "two" })) //One println(pf.applyOrElse(2, { num: Int => "two" })) //two
偏应用函数
偏应用函数(Partial Applied Function)也叫部分应用函数,跟偏函数(Partial Function)从英文名来看只有一字之差,但他们二者之间却有天壤之别。
部分应用函数, 是指一个函数有n个参数, 而我们为其提供少于n个参数, 那就得到了一个部分应用函数。
举个例子,定义好一个函数有3个参数,再提供几个有1-2个已知参数的偏应用函数
def add(x: Int, y: Int, z: Int) = x + y + z // x 已知 def addX = add(1, _: Int, _: Int) println(addX(2, 3)) //6 println(addX(3, 4)) //8 // x 和 y 已知 def addXAndY = add(10, 100, _: Int) println(addXAndY(1)) //111 // z 已知 def addZ = add(_: Int, _: Int, 10) println(addZ(1, 2)) //13
以上是Java与Scala中的偏函数与偏应用函数的使用方法的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4
