Scala函数式编程注意事项和细节讨论

1、函数的形参列表可以是多个, 如果函数没有形参,调用时 可以不带()

2、形参列表和返回值列表的数据类型可以是值类型引用类型

object Details01{
    
    
        def main(args:Array[String]):Unit={
    
    
//形参列表和返回值列表的数据类型可以是值类型和引用类型 val tiger = new Tiger
        val tiger2=test01(10,tiger)
        println(tiger2.name) // jack
        println(tiger.name) // jack
        println(tiger.hashCode()+" "+tiger2.hashCode())
        }
        def test01(n1:Int,tiger:Tiger):Tiger={
    
    println("n1="+n1)
        tiger.name="jack"
        tiger
        }}

class Tiger {
    
    
    //一个名字属性
    var name = ""
}

3、Scala中的函数可以根据函数体最后一行代码自行推断函数返回值类型,所以 return 关键字可以省略

def getSum(n1:Int,n2:Int):Int={
    
    
	return n1+n2
        }
        
def getSum(n1:Int,n2:Int):Int={
    
     
         n1+n2  //return关键字可以省略
        }

4、因为 Scala 可以自行推断,所以在省略 return 关键字的场合,返回值类型也可以省略

def getSum(n1:Int,n2:Int)={
    
     
            n1+n2
        }

5、如果函数明确使用 return 关键字,那么函数返回就不能使用自行推断了,这时要明确写成 : 返回类型 = ,当然如果你什么都不写,即使有 return 返回值仍为()

object Details02 {
    
    
  def main(args: Array[String]): Unit = {
    
    
    println(getSum2(10, 30)) // ()

  }

  //如果写了 return ,返回值类型就不能省略
  def getSum(n1: Int, n2: Int): Int = {
    
    
    return n1 + n2
  }

  //如果返回值这里什么什么都没有写,即表示该函数没有返回值
  def getSum2(n1: Int, n2: Int) {
    
    
    return n1 + n2 //这时 return 无效
  }
}

6、如果函数明确声明无返回值(声明 Unit),那么函数体中即使使用 return 关键字也不会有返回值。

/*
 如果函数明确声明无返回值(声明 Unit),
 那么函数体中即使使用 return 关键字也不会有返回值
 */
def getSum3(n1: Int, n2: Int): Unit = {
    
    
  return n1 + n2
}

7、如果明确函数无返回值或不确定返回值类型,那么返回值类型可以省略(或声明为Any)

8、Scala语法中任何的语法结构都可以嵌套其他语法结构(灵活),即:函数中可以再声明/定义函数, 类中可以再声明类 ,方法中可以再声明/定义方法。

object Details03 {
    
    
  def main(args: Array[String]): Unit = {
    
    
  
    def f1(): Unit = {
    
     //ok private final println("f1")
    }
    
    println("ok~~")
    
    def sayOk(): Unit = {
    
     // private final sayOk$1 ()
      println("main sayOk")

      def sayOk(): Unit = {
    
    
        println("sayok sayok")
      }
    }
  }
  
  def sayOk(): Unit = {
    
     //成员 println("main sayOk")
  }
}

private final sayOk$2 ()

9、Scala函数的形参,在声明参数时,直接赋初始值(默认值),这时调用函数时,如果没有指定实参,则会使用默认值。如果指定了实参,则实参会覆盖默认值。

object Details04 {
    
    
  def main(args: Array[String]): Unit = {
    
    
    println(sayOk("mary"))
  }

  //name 形参的默认值 jack
  def sayOk(name: String = "jack"): String = {
    
    
    return name + " ok! "
  }
}

10、如果函数存在多个参数,每一个参数都可以设定默认值,那么这个时候,传递的参数到底是覆 盖默认值,还是赋值给没有默认值的参数,就不确定了(默认按照声明顺序[从左到右])。在这种情况下, 可以采用带名参数

object DetailParameter05 {
    
    
  def main(args: Array[String]): Unit = {
    
    
    // mysqlCon()
    // mysqlCon("127.0.0.1", 7777) //从左到右覆盖
    //如果我们希望指定覆盖某个默认值,则使用带名参数即可,比如修改用户名和密码 mysqlCon(user = "tom", pwd = "123")
    //f6("v2") // (错误) f6(p2="v2") // (?)
  }

  def mysqlCon(add: String = "localhost", port: Int = 3306,
               user: String = "root", pwd: String = "root"): Unit = {
    
    
    println("add=" + add)
    println("port=" + port)
    println("user=" + user)
    println("pwd=" + pwd)
  }

  def f6(p1: String = "v1", p2: String) {
    
    
    println(p1 + p2);
  }
}

11、递归函数未执行之前是无法推断出来结果类型,在使用时必须有明确的返回值类型

12、scala函数的形参默认是val的,因此不能在函数中进行修改。

13、Scala函数支持可变参数

//支持 0 到多个参数
def sum(args: Int*) = {
    
    }
//支持 1 到多个参数
def sum(n1: Int, args: Int*) = {
    
    }

使用时的注意事项:

(1)args 是集合, 通过 for 循环 可以访问到各个值。
(2)案例演示: 编写一个函数 sum ,可以求出 1 到多个 int 的和。
(3)可变参数需要写在形参列表的最后。

object VarParameters {
    
    
  def main(args: Array[String]): Unit = {
    
    

    //编写一个函数 sum ,可以求出 1 到多个 int 的和
    println(sum(10, 30, 10, 3, 45, 7))
  }

  def sum(n1: Int, args: Int*): Int = {
    
    
    println("args.length" + args.length) //遍历
    var sum = n1
    for (item <- args) {
    
    
      sum += item
    }
    sum
  }

  //可变参数需要放在最后
  def sum2(args: Int*, n1: Int): Int = {
    
    
    //
    // 1 // }
  }

猜你喜欢

转载自blog.csdn.net/weixin_43520450/article/details/108429764