Sgg:Scala基础语法(下)


scala 定义函数的标准格式为:

def 函数名(参数名 1: 参数类型 1, 参数名 2: 参数类型 2) : 返回类型 = {函数体}

1 函数有返回值

  //如果使用return 必须指明返回类型
  def test1():String = {
    return "abc"
  }

  //如果不使用return,那么不必声明返回类型
  def test2() = {
    "abc"
  }

在这里插入图片描述
注: Scala 中的函数可以根据函数体最后一行代码自行推断函数返回值类型。那么在这种情况下, return 关键字可以省略,既然 Scala 可以自行推断,所以在省略 return 关键字的场合,返回值类型也可以省略。如果函数明确使用 return 关键字,那么函数无法省略返回值类型。

2 函数无返回值

注:如果函数明确声明无返回值(声明 Unit) ,那么函数体中即使使用 return 关键字
也不会有返回值。
如果明确函数无返回值或不确定返回值类型,那么返回值类型可以省略

  def test4()={
    val a = 10
    if(a > 10){
      100
    }else{
      "10"
    }
  }

在这里插入图片描述

3 函数有参数

注:函数如果参数列表不为空,那么在调用时需要传递参数,不能省略,这和 JavaScript语法不一样,在 JavaScript 中调用有参函数时,如果没有传递参数,那么参数会自动赋值为 undefined, Scala 也可以实现类似的功能, 就是在声明参数时,直接赋初始值。
一个带参数的函数如下:

  def test5(p : String)={
    println(p)
  }

在这里插入图片描述
声明函数的参数时候加默认值:

  def test5(p : String = "zhang3")={
    println(p)
  }

在这里插入图片描述
调用函数时,如果不传递参数,就采用默认的初始值,如果传递参数,传递的参数会覆盖初始化。
让我们运行这个调用方法的代码:

  def main(args: Array[String]): Unit = {
    test5()
    test5("li4")
  }
zhang3
li4

Process finished with exit code 0

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

  def test6(n:String="zhangfei" , a:Int)= {
    println("n:"+n+",a:"+a)
  }

然后调用,其中参数a使用带名参数传入:

    test6("li4",100)  //正常声明参数调用
    test6(a = 10) //不声明n,n使用函数的默认值,a值自行传入

运行结果为:

n:li4,a:100
n:zhangfei,a:10

Process finished with exit code 0

有了带名参数传入的方式,甚至我们不需要考虑 传入的参数顺序:

test6(a = 50,n = "wang5")

运行结果为:

n:wang5,a:50

Process finished with exit code 0

4 变长参数

(不确定个数参数,类似 Java 的…)

	//不定长参数的用法
  def test7(nums:Int*)= {
    var sum = 0
    for(i <- nums){
      sum += i
    }
    sum
  }
    println(test7() )
    println(test7(1))
    println(test7(1,2,3,4,5))
0
1
15

Process finished with exit code 0

5 递归函数

  • 递归是把一个复杂问题转化成很多个相同的小问题的。而且递归要明确终止条件。
  • 递归函数未执行之前是无法推断出来结果类型, 在使用时必须有明确的返回值类型
  • 简简单单安排个小阶乘:
  def test8(n:Int): Int ={
    if ( n == 1) 1 else n*test8(n-1)
  }
println(test8(3))
6

Process finished with exit code 0

6 过程

将函数的返回类型为 Unit 的函数称之为过程。如果明确函数没有返回值,那么等号可以省略
在这里插入图片描述
在这里插入图片描述

7 惰性函数

  • 函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我们首次对此取值。 这种函数我们称之为惰性函数,在 Java 的某些框架代码中称之为懒加载(延迟加载)
  • 通俗的讲:什么时候用到这个函数的返回结果了,什么时候真的执行这个函数。
  • 非立即执行的函数。
  def test10()= {
    println("test10 方法执行")
    "test10"
  }
    lazy val msg = test10()
    println("test10 方法没有执行")
    println(msg)
test10 方法没有执行
test10 方法执行
test10

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值