Scala之偏函数Partial Function

本文介绍了Scala中的偏函数PartialFunction,通过实例演示如何使用偏函数处理集合,过滤非数字元素并进行乘法操作。讲解了五种方法,包括filter/map、collect、偏函数实现和match表达式,以及偏函数的工作原理和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、定义

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函数支持偏函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值