美文网首页
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-偏函数

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