• 技术文章 >Java >java教程

    Java与Scala中的偏函数与偏应用函数的使用方法

    王林王林2023-04-21 16:31:18转载25

    偏函数

    偏函数(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中文网其它相关文章!

    声明:本文转载于:亿速云,如有侵犯,请联系admin@php.cn删除
    专题推荐:Java scala
    上一篇:Java中synchronized锁的升级过程是什么? 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 如何避免Java泛型擦除问题及解决方法?• Java中如何记录方法抛出的所有异常?• 如何利用Java枚举实现单例模式?• Java中如何实现插入排序算法?• Java算法设计与分析:分治算法实例详解
    1/1

    PHP中文网