• Scala 函数\匿名函数 至简原则详解


    Scala函数具有至简原则,遵循能省就省的风格,这也让我们这些初次接触到Scala编程的程序员在阅读程序是感到非常困惑,导出都是_,也不知道这些杠代表什么意思。因此将这些函数的简化原则记录了下来,供自己更好的记忆。

    函数的简化原则包含普通函数的简化原则匿名函数的简化原则,我将先介绍普通函数的简化原则,然后再介绍匿名函数的简化原则

      普通函数至简原则:

    标准函数的写法如下所示

    (1)return 可以省略,Scala 会使用函数体的最后一行代码作为返回值

    (2)如果函数体只有一行代码,可以省略花括号

    (3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)

    (4)如果有 return,则不能省略返回值类型,必须指定

    (5)如果函数明确声明 unit,那么即使函数体中使用 return 关键字也不起作用

    (6)Scala 如果期望是无返回值类型,可以省略等号

    (7)如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加

    (8)如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略

    (9)如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略

     //至简原则,能省则省
        //(1)return可以省略,scala会使用函数体的最后一行代码作为返回值
        def f1(s:String):String = {
          s+" cls"
        }
    
        //(2)如果函数体只有一行代码,可以省略花括号
        def f2(s:String):String = s+" cls"
    
        //(3)返回值类型如果能够推断出来,那么可以省略(:一起省略)
        def f3(s:String) = s+"cls"
    
        var s = f3("dh ai ")
        println(s)
    
        //(4)如果有return,那么不能省略返回值类型,必须指定
        def f4(s:String) :String = {
          return s+"cls"
        }
    
        //(5)如果有函数声明unit,那么及时函数体中使用return关键字也不起作用
        def f5(s:String):Unit = {
          return s+" cls"
        }
        val as = f5("dh ")
        println(as)
    
        //(6)如果妻王氏无返回值类型,则可省略=
        def f6(s:String):String={
            return s+" cls"
        }
    
        //(7)如果函数无参,但是声明了参数列表,那么调用时小括号可加可不加
        def f7():String={
          "cls"
        }
        val as1 = f7()
        val as2 = f7
        println(as1 +" "+ as2)
    
        //(8)如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略
        def f8 = "cls"
        println(f8)
    
        //(9)如果不关心名称,只关心函数名(def)可以省略
        def f9 = (x:String)=>{println("wusong")}
        def f10(f:String=>Unit) = {
          f("")
        }
        f10(f9)
        println(f10((x:String)=>{println("wusong")}))

    匿名函数之间原则:

    首先先看一下匿名函数的写法,如下所示,

          (x:Int)=>{函数体}

    (1)参数的类型可以省略,会根据形参进行自动的推导

    (2)类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参 数超过 1 的永远不能省略圆括号。

    (3)匿名函数如果只有一行,则大括号也可以省略

    (4)如果参数只出现一次,则参数省略且后面参数可以用_代替

     //定义一个函数:参数包含数据和逻辑函数
        def operation(arr:Array[Int],op:Int=>Int)={
          for (elem <- arr) yield op(elem)
        }
    
        //定义逻辑函数
        def op(ele:Int):Int = {
          ele+1
        }
    
        //(3)标准函数调用
        val arr = operation(Array(1,2,3,4),op)
        println(arr.mkString(","))
    
        //(4)采用匿名函数
        val arr1 = operation(Array(1,2,3,4),(ele:Int)=>{
          ele+1
        })
        println(arr1.mkString(","))
    
        //(4.1)参数类型可以省略,会根据形参进行自动推导
        var arr2 = operation(Array(1,2,3,4),(ele)=>{
          ele+1
        })
        println(arr2.mkString(","))
    
        //(4.2)类型省略之后,发现只有一个参数,则圆括号可以省略;
        //其他情况:没有参数和参数超过1的永远不能省略圆括号
        val arr3 = operation(Array(1,2,3,4),ele =>{
          ele+1
        })
        println(arr3.mkString(","))
    
        //(4.3)匿名函数如果只有一行,则大括号也可以省略
        val arr4 = operation(Array(1,2,3,4),ele => ele+1)
        println(arr4.mkString(","))
    
        //(4.4)如果参数只出现一次,则参数可以省略切后面参数可以用_代替
        val arr5 = operation(Array(1,2,3,4),_+1)
        println(arr5.mkString(" "))

    举一个匿名函数的例子,供大家更好的理解匿名函数的简化写法

    def calculator(a: Int, b: Int, op: (Int, Int) => Int): Int = {
     op(a, b)
     }
     // (1)标准版
     println(calculator(2, 3, (x: Int, y: Int) => {x + y}))
     // (2)如果只有一行,则大括号也可以省略
     println(calculator(2, 3, (x: Int, y: Int) => x + y))
     // (3)参数的类型可以省略,会根据形参进行自动的推导;
     println(calculator(2, 3, (x , y) => x + y))
     // (4)如果参数只出现一次,则参数省略且后面参数可以用_代替
     println(calculator(2, 3, _ + _))
  • 相关阅读:
    Design Patterns(十):Decorator PatternVB代码
    Design Patterns(九):Composite PatternVB代码
    理解AJAX
    【Excel】取括号之间的数值
    Design Patterns(八):Bridge PatternVB代码
    【SQLSERVER】导入导出Access
    理解SOA
    Design Patterns(六):Prototype PatternVB代码
    Design Patterns(十二):Flyweight PatternVB代码
    Design Patterns(十一):Facade PatternVB代码
  • 原文地址:https://www.cnblogs.com/wfswf/p/15811789.html
Copyright © 2020-2023  润新知