• scala记录(2)scala函数


    1.Scala函数的定义

    • 有参函数
    • 无参函数

    def fun (a: Int , b: Int ) : Unit = {
       println(a+b)
     }
    fun(1,1)
        
    def fun1 (a : Int , b : Int)= a+b
        println(fun1(1,2))

    注意点:

      l  函数定义语法 用def来定义

      l  可以定义传入的参数,要指定传入参数的类型

      l  方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归函数中或者函数的返回值是函数类型的时候。

      l  scala中函数有返回值时,可以写return,也可以不写return,会把函数中最后一行当做结果返回。当写return时,必须要写函数的返回值。

      l  如果返回值可以一行搞定,可以将{}省略不写

      l  传递给方法的参数可以在方法中使用,并且scala规定方法的传过来的参数为val的,不是var的。

      l  如果去掉方法体前面的等号,那么这个方法返回类型必定是Unit的。这种说法无论方法体里面什么逻辑都成立,scala可以把任意类型转换为Unit.假设,里面的逻辑最后返回了一个string,那么这个返回值会被转换成Unit,并且值会被丢弃。

        def max(x:Int,y:Int) = {
          if(x>y){
             x
          }else{
             y
          }
        }
        println(max(100,2))
        def max(x:Int,y:Int) = if(x>y) x else y 
        println(max(100,2))

    2.递归函数

      /**
         * 递归函数 
         * 5的阶乘
         */
        def fun2(num :Int) :Int= {
          if(num ==1)
            num
          else 
            num * fun2(num-1)
        }
        print(fun2(5))

    3.包含参数默认值的函数

      l  默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。

      l  如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。

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

    4.可变参数个数的函数

      l  多个参数用逗号分开

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

    5.匿名函数

    5.1 有参匿名函数

    5.2 无参匿名函数

    5.3 有返回值的匿名函数  

      可以将匿名函数返回给val定义的值
      匿名函数不能显式声明函数的返回类型

     /**
         * 匿名函数
         *   1."=>"就是匿名函数
         *   2.匿名函数调用要赋值给一个变量,调用直接调用这个变量就可以
         *   3.匿名函数不能显式的写函数返回类型
         */
    //有参数匿名函数
        val value1 = (a : Int) => {
          println(a)
        }
        value1(1)
        //无参数匿名函数
        val value2 = ()=>{
          println("我爱尚学堂")
        }
        value2()
        //有返回值的匿名函数
        val value3 = (a:Int,b:Int) =>{
          a+b
        }
        println(value3(4,4)) 

    6. 嵌套函数

     /**
         * 嵌套函数
         * 例如:嵌套函数求5的阶乘
         */
        def fun5(num:Int)={
          def fun6(a:Int,b:Int):Int={
            if(a == 1){
              b
            }else{
              fun6(a-1,a*b)
            }
          }
          fun6(num,1)
        }
        println(fun5(5))

    7. 偏应用函数

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

        /**
         * 偏应用函数
         */
        def log(date :Date, s :String)= {
          println("date is "+ date +",log is "+ s)
        }
        
        val date = new Date()
        log(date ,"log1")
        log(date ,"log2")
        log(date ,"log3")
        
        //想要调用log,以上变化的是第二个参数,可以用偏应用函数处理
        val logWithDate = log(date,_:String)
        logWithDate("log11")
        logWithDate("log22")
        logWithDate("log33")

    8. 高阶函数

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

      l  函数的参数是函数

      l  函数的返回是函数

      l  函数的参数和函数的返回是函数

      /**
         * 高阶函数
         * 函数的参数是函数        或者函数的返回是函数        或者函数的参数和返回都是函数
         */
        
        //函数的参数是函数
        def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = {
          f(a,100)
        }
        def f(v1 :Int,v2: Int):Int  = {
          v1+v2
        }
        
        println(hightFun(f, 1))
        
        //函数的返回是函数
        //1,2,3,4相加
        def hightFun2(a : Int,b:Int) : (Int,Int)=>Int = {
          def f2 (v1: Int,v2:Int) :Int = {
            v1+v2+a+b
          }
          f2
        }
        println(hightFun2(1,2)(3,4))
        
        //函数的参数是函数,函数的返回是函数
        def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = {
          f
        } 
        println(hightFun3(f)(100,200))
        println(hightFun3((a,b) =>{a+b})(200,200))
        //以上这句话还可以写成这样
        //如果函数的参数在方法体中只使用了一次 那么可以写成_表示
        println(hightFun3(_+_)(200,200))

    9. 柯里化函数

      l  可以理解为高阶函数的简化

     /**
         * 柯里化函数
         */
        def fun7(a :Int,b:Int)(c:Int,d:Int) = {
          a+b+c+d
        }
        println(fun7(1,2)(3,4))
  • 相关阅读:
    easyui-tree/combotree 子节点前端懒加载(主要解决ie11下加载慢
    解决 Chrome 下表单自动填充问题 (两种方法
    代码编辑器:本地JS文件上传并加载到页面
    PC端使用rem进行屏幕适配
    ECharts 点击非图表区域的点击事件不触发问题
    Angular2+ 使用 Post 请求下载文件
    Express + Element-ui 实现图片/文件上传
    phpMyAdmin -- 没有权限操作用户
    Note of Moment -- 日期处理
    Angular 自定义表单控件 -- CheckboxGroupComponent
  • 原文地址:https://www.cnblogs.com/kpsmile/p/10372198.html
Copyright © 2020-2023  润新知