scala一些函数

1,匿名函数(lambda):没有名字的函数就是匿名函数,可以通过函数表达式来设置匿名函数

val test: (Int, Int) => Int = (a: Int, b: Int) => {
println("a+b=" + (a + b))
  a + b
}

2,用函数作为参数传递

def Test(f: (Int, Int) => Int, msg: String): String = {
val a = 100
  val b = 200
  val result = f(a, b)
  msg + result
}
val f: (Int, Int) => Int = (a: Int, b: Int) => {
println("a value:" + a + ",b value:" + b)
  a * b
}
val str = funTest(f, "张三的工资是:")
println(str)

//a value:100,b value:200
//张三的工资是:20000

3,定一个方法,返回值是函数

def Test(num: Int): (Int, Int) => Int = {
      println("num value:" + num)                 //num value:9
      def sum(a: Int, b: Int): Int = {
        a + b
      }
      def sub(a: Int, b: Int): Int = {
        a - b
      }
      if (num % 2 == 0) sum else sub
    }
//方法一
    val i = Test(9)(10, 10)
    println(i)                                    //0
//方法二
    val iFun: (Int, Int) => Int = Test(9)
    val iValue = iFun(10, 20)
    println(iValue)                                //-10

4,函数柯里化

又称部分求值,将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)或者f(a, b)(c)或者f(a)(b, c)

注:柯里化不会调用函数。它只是对函数进行转换

def fun(a: Int, b: Int, c: Int, d: Int): Int = {
      a + b + c + d
    }

    def fun2(a: Int, b: Int)(c: Int, d: Int): Int = {
      a + b + c + d
    }

    def fun3(a: Int, b: Int, c: Int)(d: Int): Int = {
      a + b + c + d
    }

    def fun4(a: Int)(b: Int)(c: Int)(d: Int): Int = {
      a + b + c + d
    }

    println(fun(1, 2, 3, 4))
    println(fun2(1, 2)(3, 4))
    println(fun3(1, 2, 3)(4))  //结果都是10

5,偏函数

对给定的输入参数类型,函数可接受该类型的任何值。换句话说,一个(Int) => String 的函数可以接收任意Int值,并返回一个字符串。
对给定的输入参数类型,偏函数只能接受该类型的某些特定的值。一个定义为(Int) => String 的偏函数可能不能接受所有Int值为输入
//偏函数:string进,int出
def funPartition: PartialFunction[String, Int] = {
      case "hello" => 1
      case "world" => 2
      case _ => 3
    }
val strings = Array("hello", "java", "world", "hive", "spark")
val ints = strings.collect(funPartition)
for (i <- ints) {
      println(i)
    }
//1 3 2 3 3

//偏函数:string出,int进
    def funPart2:PartialFunction[Int,String]={
      case 1 =>"优秀"
      case 2 =>"良好"
      case 3 =>"合格"
      case _ =>"战五渣"
    }
    val ints1 = Array(1, 5, 4, 6, 8, 6, 7)
    val string: Array[String] = ints1.collect(funPart2)
    println(string.toList)
//List(优秀, 战五渣, 战五渣, 战五渣, 战五渣, 战五渣, 战五渣)

6,部分函数

def showAlarm(title:String,content:String,height:Double)={
      println(title+" "+content+" "+height)
    }
//showAlarm("高水位警告","即将超过最高水位线,当前水位:",18.56)
    val title="高水位警告"
    def showWaterAlarm=showAlarm(title,_:String,_:Double)
    showWaterAlarm("即将超过最高水位线,当前水位:",18.56)

    val content="即将超过最高水位线,当前水位:"
    val content2="即将到达最低水位线,当前水位:"
    def showWaterHeightAlarm=showWaterAlarm(content,_:Double)
    def showWaterLowerAlarm=showWaterAlarm(content2,_:Double)
    showWaterHeightAlarm(18.56)
    showWaterLowerAlarm(8.02)

/*
高水位警告 即将超过最高水位线,当前水位: 18.56
高水位警告 即将超过最高水位线,当前水位: 18.56
高水位警告 即将到达最低水位线,当前水位: 8.02
*/

7,隐式函数

隐式转换可以在不需改任何代码的情况下,扩展某个类的功能。

//string 转成 int
implicit def stringToInt(value: String): Int = Integer.parseInt(value)
val a: Int = "111";
def main(args: Array[String]): Unit = {
    println(a+4)                                //115 表示a已经转换成int类型
}
----------------------------------------------------------
//int 转成 string
implicit def intToString(value:Int):String={
    println(value.getClass+"  "+value)          //int 10
    value.toString
  }
val s:String=10
def main(args: Array[String]): Unit = {
    println(s+10)                               //1010 表示s已经传换成string类型
    println(s+"dgsgsd")                         //10dgsgsd  同上
  }
-----------------------------------------------------------
//double转成string,并加500
implicit def doubleToString(value:Double):String={
    var v1=value+500
    v1.toString
  }
def main(args: Array[String]): Unit = {
    val doubString:String=12800.98
    println(doubString);                         //13300.98是string类型
}
方法传值 > 隐式传值 > 默认值
一,方法传值举例
implicit val num:Int=11
implicit val gender:String="male" //---隐式值
def sum(a:Int)( implicit name:String="aaa",b:Int=13):Int={ //---默认值
println(gender)
a+b
}
println(sum (10)("female",10)) //--方法传值
//以上结果为female 20
------------------------------------------------------------------------
二,隐式传值举例
println(sum(10)) //结果是male 21
------------------------------------------------------------------------
三,默认值举例
不要隐式值,再运行结果是aaa 23

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值