Scala部分函数、偏函数

部分函数是缺少部分参数的逻辑概念,如sum函数的部分应用。在Scala中,偏函数是PartialFunction类型,仅处理参数定义域的子集,其他情况抛出异常。偏函数常与case语句结合,用于特定模式匹配。本文通过案例深入探讨这部分内容。

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

部分函数

部分应用函数(Partial Applied Function)是缺少部分参数的函数,是一个逻辑上概念。

例如:def sum(x: Int, y: Int, z: Int) = x + y + z,
当调用sum的时候,如果不提供所有的参数,或者只提供某些参数时,比如sum _ , sum(3, _: Int, :Int), sum(: Int, 3, 4), 这样就生成了所谓的部分应用函数。

案例:

 def showMsg(title:String, content:String, num:Int)={
    println(title+": "+content+": "+num+"米")
  }
  showMsg("警告","当前水位是",12)

   //部分函数形式
  val title = "警告"
  def showWaterAlter = showMsg(title,_:String,_:Int)  //部分函数
  showWaterAlter("当前水位",14)

在这里插入图片描述

偏函数

在Scala中,偏函数是具有类型PartialFunction[-T,+V]的一种函数。T是其接受的函数类型,V是其返回的结果类型。

偏函数最大的特点就是它只接受和处理其参数定义域的一个子集,而对于这个子集之外的参数则抛出运行时异常。这与Case语句的特性非常契合,因为我们在使用case语句是,常常是匹配一组具体的模式,最后用“_”来代表剩余的模式。如果一一组case语句没有涵盖所有的情况,那么这组case语句就可以被看做是一个偏函数。

案例一:

//偏函数
def funPartional:PartialFunction[String, Int]={
  case "hello" => 1
  case "world" => 2
  case  _ => 0
}
val num = funPartional("scala")
println(num)   // 0

//批量输入,判断输出
val worlds = List("hello","world","gree","kb09")
//方式一
val ints:List[Int] = worlds.collect(funPartional)
println(ints)            // List(1, 2, 0, 0)
ints.foreach(println)    // 1 2 0 0

//方式二
worlds.collect(funPartional).foreach(println)   // 1 2 0 0

//方式三
worlds collect funPartional foreach println   // 1 2 0 0

在这里插入图片描述

案例二:

//输入字符,输出元组
def funTupple:PartialFunction[Char,(Char,Int)]={
  case 'A' => ('A',1)
  case 'B' => ('B',1)
  case _ => ('X',1)
}
val tuple:(Char,Int) = funTupple('A')
println(tuple)   // (A,1)

var chars = List('A','B','C','D')
val tuples:List[(Char,Int)] = chars.collect(funTupple)
//方式一
tuples.foreach(println)  // (A,1),(B,1),(X,1),(X,1)

//方式二
tuples.foreach(x => {println(x._1,x._2)})  // (A,1),(B,1),(X,1),(X,1)

在这里插入图片描述

案例三:

//输入不同类型数据,输出Int类型
def fun2:PartialFunction[Any,Int]={
  case i:Int => i
  case _ => 0
}

var list = List("a","c",2,2.5,4,6)
list.collect(fun2).foreach(println)   // 0 0 2 0 4 6

在这里插入图片描述
参考博客:https://www.cnblogs.com/GatsbyNewton/p/4776679.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值