Scala之偏函数Partial Function

Posted YaoYong_BigData

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala之偏函数Partial Function相关的知识,希望对你有一定的参考价值。

一、定义

1.被包在花括号内没有match的一组case语句是一个偏函数
2.偏函数是PartialFunction[A, B]的一个实例
  - A代表输入参数类型
  - B代表返回结果类型
3.偏函数在scala中是一个特质

二、实例

1.需求

给你一个集合 val list = List(1, 2, 3, "a", true) ,请完成如下要求:
将集合list中的所有数字乘以10,并返回一个新的集合
要求忽略掉非数字的元素,即返回的新的集合形式为 (10,20,30)

2.代码

object _06PartialFunction 
  def main(args: Array[String]): Unit = 
    val list = List(1, 2, 3, "a", true)
    
    //方式1
    list.filter(x => x.isInstanceOf[Int]).map(x => x.asInstanceOf[Int] * 10).foreach(println)
    println("-" * 60)
    
    //方式2
    val list0 = list.collect
      case x:Int => x * 10
    
    list0.foreach(println)
    println("------list0------")
    
    //方式3:推荐用法
    val pf1:PartialFunction[Any, Int] = 
      case x:Int => x * 10
    
    //collect方法,类似于map方法,collect方法只能传递偏函数
    list.collect(pf1).foreach(println)
    println("------pf1------")
    
    //方式4
    val pf2 = new PartialFunction[Any,Int] 
      //只对返回true的时候交给apply处理
      override def isDefinedAt(x: Any): Boolean = x.isInstanceOf[Int]
      //处理方法
      override def apply(v1: Any): Int = v1.asInstanceOf[Int] * 10
    
    list.collect(pf2).foreach(println)
    println("------pf2------")
    
    //方式5
    val pf3 = new PartialFunction[Any, Int] 
      override def isDefinedAt(x: Any): Boolean = x match 
        case a:Int => true
        case _ => false
      
      override def apply(v1: Any): Int = v1 match 
        case a:Int => a * 10
      
    
    list.collect(pf3).foreach(println)
    println("------pf3------")

  

上述每种方式都会打印:

10
20
30

三、偏函数的小结

1.使用构建特质的实现类(使用的方式是PartialFunction的匿名子类);
2.PartialFunction 是个特质(看源码);
3.构建偏函数时,参数形式 [Any, Int]是泛型,第一个表示参数类型,第二个表示返回参数;
4.当使用偏函数时,会遍历集合的所有元素,编译器执行流程时先执行isDefinedAt()如果为true ,就会执行 apply, 构建一个新的Int 对象返回;
5.执行isDefinedAt() 为false 就过滤掉这个元素,即不构建新的Int对象;
6.map函数不支持偏函数,因为map底层的机制就是所有循环遍历,无法过滤处理原来集合的元素;collect函数支持偏函数。

以上是关于Scala之偏函数Partial Function的主要内容,如果未能解决你的问题,请参考以下文章

Scala之偏函数Partial Function

Scala之偏函数Partial Function

Python之偏函数

Scala的偏函数可以说说吗?

Python入门教程第61篇 函数进阶之偏函数

underscore 系列之内部函数 restArgs