• Scala---方法与函数


    一、Scala方法的定义

    • 有参方法&无参方法
    1. def fun (a: Int , b: Int) : Unit = {
    2. println(a+b)
    3. }
    4. fun(1,1)
    5. def fun1 (a: Int , b: Int) = a+b
    6. println(fun1(1,2))

    注意点:

    1. 方法定义语法 用def来定义
    2. 可以定义传入的参数,要指定传入参数的类型
    3. 方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归方法中或者方法的返回值是函数类型的时候。
    4. scala中方法有返回值时,可以写return,也可以不写return,会把方法中最后一行当做结果返回。当写return时,必须要写方法的返回值。
    5. 如果返回值可以一行搞定,可以将{}省略不写
    6. 传递给方法的参数可以在方法中使用,并且scala规定方法的传过来的参数为val的,不是var的。
    7. 如果去掉方法体前面的等号,那么这个方法返回类型必定是Unit的。这种说法无论方法体里面什么逻辑都成立,scala可以把任意类型转换为Unit.假设,里面的逻辑最后返回了一个string,那么这个返回值会被转换成Unit,并且值会被丢弃。

    二、递归方法

    1. 1./**
    2. 2.* 递归方法
    3. 3.* 5的阶乘
    4. 4.*/
    5. def fun2(num : Int) : Int = {
    6. if(num == 1)
    7. num
    8. else
    9. num * fun2(num-1)
    10. }
    11. print(fun2(5))

    三、参数有默认值的方法

    1. 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。
    2. 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。
    1. 1./**
    2. 2.* 包含默认参数值的函数
    3. 3.* 注意:
    4. 4.* 1.默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值
    5. 5.* 2.如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称
    6. 6.*/
    7. 7.def fun3(a :Int = 10,b:Int) = {
    8. 8. println(a+b)
    9. 9.}
    10. 10.fun3(b=2)

    四、可变参数的方法

    1. 多个参数用逗号分开
    1. 1./**
    2. 2.* 可变参数个数的函数
    3. 3.* 注意:多个参数逗号分开
    4. 4.*/
    5. 5.def fun4(elements :Int*)={
    6. 6. var sum = 0;
    7. 7. for(elem <- elements){
    8. 8. sum += elem
    9. 9. }
    10. 10. sum
    11. 11.}
    12. 12.println(fun4(1,2,3,4))

    五、匿名函数

    1. 有参匿名函数
    2. 无参匿名函数
    3. 有返回值的匿名函数
    4. 可以将匿名函数返回给val定义的值
    1. 1./**
    2. 2.* 匿名函数
    3. 3.* 1.有参数匿名函数
    4. 4.* 2.无参数匿名函数
    5. 5.* 3.有返回值的匿名函数
    6. 6.* 注意:
    7. 7.* 可以将匿名函数返回给定义的一个变量
    8. 8.*/
    9. 9.//有参数匿名函数
    10. 10.val value1 = (a : Int) => {
    11. 11. println(a)
    12. 12.}
    13. 13.value1(1)
    14. 14.//无参数匿名函数
    15. 15.val value2 = ()=>{
    16. 16. println("我爱尚学堂")
    17. 17.}
    18. 18.value2()
    19. 19.//有返回值的匿名函数
    20. 20.val value3 = (a:Int,b:Int) =>{
    21. 21. a+b
    22. 22.}
    23. 23.println(value3(4,4))

    六、嵌套方法

    1. 1./**
    2. 2.* 嵌套方法
    3. 3.* 例如:嵌套方法求5的阶乘
    4. 4.*/
    5. 5.def fun5(num:Int)={
    6. 6. def fun6(a:Int,b:Int):Int={
    7. 7. if(a == 1){
    8. 8. b
    9. 9. }else{
    10. 10. fun6(a-1,a*b)
    11. 11. }
    12. 12. }
    13. 13. fun6(num,1)
    14. 14.}
    15. 15.println(fun5(5))

    七、偏应用函数

    偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。

    1. 1./**
    2. 2.* 偏应用函数
    3. 3.*/
    4. 4.def log(date :Date, s :String)= {
    5. 5. println("date is "+ date +",log is "+ s)
    6. 6.}
    7. 7.
    8. 8.val date = new Date()
    9. 9.log(date ,"log1")
    10. 10.log(date ,"log2")
    11. 11.log(date ,"log3")
    12. 12.
    13. 13.//想要调用log,以上变化的是第二个参数,可以用偏应用函数处理
    14. 14.val logWithDate = log(date,_:String)
    15. 15.logWithDate("log11")
    16. 16.logWithDate("log22")
    17. 17.logWithDate("log33")

    八、高阶函数

    函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数。

    1. 函数的参数是函数
    2. 函数的返回是函数
    3. 函数的参数和函数的返回是函数
    1. 1./**
    2. 2.* 高阶函数
    3. 3.* 函数的参数是函数 或者函数的返回是函数 或者函数的参数和返回都是函数
    4. 4.*/
    5. 5.
    6. 6.//函数的参数是函数
    7. 7.def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = {
    8. 8. f(a,100)
    9. 9.}
    10. 10.def f(v1 :Int,v2: Int):Int = {
    11. 11. v1+v2
    12. 12.}
    13. 13.
    14. 14.println(hightFun(f, 1))
    15. 15.
    16. 16.//函数的返回是函数
    17. 17.//12,3,4相加
    18. 18.def hightFun2(a : Int,b:Int) : (Int,Int)=>Int = {
    19. 19. def f2 (v1: Int,v2:Int) :Int = {
    20. 20. v1+v2+a+b
    21. 21. }
    22. 22. f2
    23. 23.}
    24. 24.println(hightFun2(1,2)(3,4))
    25. 25.
    26. 26.//函数的参数是函数,函数的返回是函数
    27. 27.def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = {
    28. 28. f
    29. 29.}
    30. 30.println(hightFun3(f)(100,200))
    31. 31.println(hightFun3((a,b) =>{a+b})(200,200))
    32. 32.//以上这句话还可以写成这样
    33. 33.//如果函数的参数在方法体中只使用了一次 那么可以写成_表示
    34. 34.println(hightFun3(_+_)(200,200))

    九、柯里化函数

    1. 1./**
    2. 2.* 柯里化函数
    3. 3.*/
    4. 4.def fun7(a :Int,b:Int)(c:Int,d:Int) = {
    5. 5. a+b+c+d
    6. 6.}
    7. 7.println(fun7(1,2)(3,4))

  • 相关阅读:
    排序及其代码详解~
    【打卡】21天学习挑战赛—RK3399平台开发入门到精通-day8
    国家自然科学基金委资助项目简介
    C++重载操作符
    21-CSS中的3D属性
    软件项目可行性研究报告
    一日一技:Python + Excel——飞速处理数据分析与处理
    一个28岁程序员入行自述和感受
    国产自研BI系统,更懂中国企业数据分析需求
    vue_day3
  • 原文地址:https://blog.csdn.net/yaya_jn/article/details/134405030