美文网首页
scala-偏函数

scala-偏函数

作者: const_qiu | 来源:发表于2020-07-11 23:00 被阅读0次

将包在大括号内的一组case语句封装为函数,称之为偏函数。
partialFunction 是一个特质

为什么使用使用偏函数
一个具体的应用
常规方法:

/*
给你一个集合val list = List(1, 2, 3, 4, "abc") ,请完成如下要求:
将集合list中的所有数字+1,并返回一个新的集合
要求忽略掉 非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5)

 */
object PartialFunDemo01 {
  def main(args: Array[String]): Unit = {
    //思路1 filter + map 方式解决
    //虽然可以解决问题,但是麻烦.

    val list = List(1, 2, 3, 4, "hello")
    // 先过滤,再map
    println(list.filter(f1).map(f3).map(f2))

    //思路2-模式匹配
    //小结:虽然使用模式匹配比较简单,但是不够完美
    val list2 = list.map(addOne2)
    println("list2=" + list2)


  }

  //模式匹配
  def addOne2( i : Any ): Any = {
    i match {
      case x:Int => x + 1
      case _ =>
    }
  }


  def f1(n: Any): Boolean = {
    n.isInstanceOf[Int]
  }

  def f2(n: Int): Int = {
    n + 1
  }

  //将Any->Int [map]
  def f3(n: Any): Int = {
    n.asInstanceOf[Int]
  }
}

使用偏函数解决:

object PartialFunDemo02 {
  def main(args: Array[String]): Unit = {
    //使用偏函数解决
    val list = List(1, 2, 3, 4, "hello")
    //定义一个偏函数
    //1. PartialFunction[Any,Int] 表示偏函数接收的参数类型是Any,返回类型是Int
    //2. isDefinedAt(x: Any) 如果返回true ,就会去调用 apply 构建对象实例,如果是false,过滤
    //3. apply 构造器 ,对传入的值 + 1,并返回(新的集合)
    val partialFun = new PartialFunction[Any,Int] {

      override def isDefinedAt(x: Any) = {
        println("x=" + x)
        x.isInstanceOf[Int]
      }
      var a:Any=1
    

      override def apply(v1: Any) = {
        println("v1=" + v1)
        v1.asInstanceOf[Int] + 1
      }
    }

    //使用偏函数
    //说明:如果是使用偏函数,则不能使用map,应该使用collect
    //说明一下偏函数的执行流程
    //1. 遍历list所有元素
    //2. 然后调用 val element = if(partialFun-isDefinedAt(list单个元素)) {partialFun-apply(list单个元素) }
    //3. 每得到一个 element,放入到新的集合,最后返回
    val list2 = list.collect(partialFun)
    println("list2" + list2)
  }
}

生命偏函数需要重写特质中的方法,有时略显麻烦,Scala提供了简单的方法
方法一:

def f2:PartialFunction[Any,Int]={
case i:Int =>i+1 //case 语句可以自动转化为偏函数
}
var list2 = List(1,2,3,4,"hh").collect(f2)

方法二:

val list = List(1, 2, 3, 4, 1.2, 2.4, 1.9f, "hello")
val list3 = list.collect{
      case i:Int => i + 1
      case j:Double => (j * 2).toInt
      case k:Float => (k * 3).toInt
    }
    println("list3=" + list3) // (2,3,4,5)

相关文章

  • scala-偏函数

    将包在大括号内的一组case语句封装为函数,称之为偏函数。partialFunction 是一个特质 为什么使用使...

  • Scala-函数式编程

    Scala-函数式编程 1.函数式编程 1.1 面向对象和面向过程 面向对象 按照功能划分问题,将功能分解成不同的...

  • Scala-模式匹配、样例类、Option类、偏函数

    1、匹配模式Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。并且Sca...

  • 笨笨的学pythonDay06

    接着昨天未学完的函数,还有个偏函数和装饰器,先说一下偏函数,装饰器没有看明白 1.偏函数 偏函数可以通过将函数参数...

  • 偏函数

    偏函数作用 Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial func...

  • 偏函数

    当一个函数有很多参数时,调用者就需要提供多个参数。如果减少参数个数,就可以简化调用者的负担。 比如,int()函数...

  • 偏函数

  • 偏函数

    偏函数用法是指创建一个调用另外一个部分—参数或变量已经预置的函数—的函数的用法。这句话相对较为拗口,下面我们以实例...

  • 偏函数

    偏函数: functools模块提供很多有用的功能,其中就有偏函数 tip:int()函数可提供额外的base参数...

  • 偏函数

网友评论

      本文标题:scala-偏函数

      本文链接:https://www.haomeiwen.com/subject/sldwcktx.html