当前位置: 首页 > article >正文

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


http://www.kler.cn/a/2979.html

相关文章:

  • unity学习22:Application类其他功能
  • openssl 生成证书 windows导入证书
  • 12.udp
  • [250125] DeepSeek 发布开源大模型 R1,性能比肩 OpenAI o1 | 希捷推出高达 36TB 的硬盘
  • DRF开发避坑指南01
  • 1.Template Method 模式
  • java调用chatgpt接口,实现专属于自己的人工智能助手
  • 2023面试题汇总二
  • leetcode究极刷题笔记(11~15)
  • NC65 单据控制规则
  • WPF毛笔字实现过程
  • 【剑指offer】旋转数组的最小数字
  • 【算法】手把手学会二分查找
  • 从暴力递归到动态规划(2)小乖,你也在为转移方程而烦恼吗?
  • 程序员接私活一定要知道的事情,我走的弯路你们都别走了
  • Python 多线程
  • 5.多线程学习
  • 学习黑客十余年,如何成为一名高级的安全工程师?
  • Java奠基】Java经典案例讲解
  • C++ 12 文件操作
  • 锂电池充电的同时也能放电吗?
  • STL--vector
  • 【C语言初阶】循环语句
  • 5G将在五方面彻底改变制造业
  • 【vue3】小小入门介绍
  • Celery使用:优秀的python异步任务框架