加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala函数

发布时间:2020-12-16 09:21:23 所属栏目:安全 来源:网络整理
导读:Scala除了方法外,还支持函数,方法对对象进行操作,但是函数不是。 def func(n: String) = 表达式 如果函数体有多个表达式,则可以使用代码块,代码块的最后一个表达式的值就是 函数的返回值 def func(n: String) = { } ?在函数中,并不需要 return来返回值

Scala除了方法外,还支持函数,方法对对象进行操作,但是函数不是。

def func(n: String) = 表达式
如果函数体有多个表达式,则可以使用代码块,代码块的最后一个表达式的值就是 函数的返回值
def func(n: String) = { }

?在函数中,并不需要 return来返回值,而且只要函数不是递归的,可以不用指定返回类型,如果是递归函数,则必须要指定返回类型

def fac(n: Int): Int = if (n<0) n=1 else n*fac(n-1)

?

默认参数

def decorate(str: String,left: String="[",right: String="]") = left + str + right

?相对参数的个数不够,默认参数从后往前逐个应用进来

decorate("Hello",">>>[") // >>>[Hello]

?

带名参数

提供参数值的时候,可以执行参数名,指定参数名的时候,参数的顺序可以不和函数定义时的完全一致

decorate(left="<<<",str="hello",right=">>>")

?

变长参数

可以接受可变长度参数列表的函数

def  sum(args: Int*) = {
    var result = 0
    for(arg <- args) result+=arg
    result   
}

val = sum(1,3,4,7,25) 函数得到是一个seq类型

如果有一个值序列,不能直接传入函数中  val = sum(1 to 5) //错误

如果sum传入单个参数,那么改参数必须要是单个整数,而不是整数区间,如果希望这个参数作为参数当做参数序列处理,需要加上 :_*

val s = sum(1 to 5: _*)
?
过程
过程就是没有返回值的函数,函数体代码块前没有=,(认为返回值是 Unit类型)
  def box(s: String){
     var border = "-"*s.length() + "--n"
     println(border + "|" + s + "|n" + border)
   }

或者

def box(s: String): Unit = {
     var border = "-"*s.length() + "--n"
     println(border + "|" + s + "|n" + border)
   }

?

懒值

当val 被声明为lazy的时候,它的初始化将会被推迟,知道首次使用对它取值

lazy val words = scala.io.Source.fromFile("/opt/words").mkString

懒值可以认为是介于 val def 的中间状态

val words = scala.io.Source.fromFile("/opt/words").mkString //words被定义的时候被取值

lazy val words = scala.io.Source.fromFile("/opt/words").mkString //words首次被使用时被取值

def words = scala.io.Source.fromFile("/opt/words").mkString  //words每次被使用的被取值

懒值并不是没有额外的开销,每次访问懒值,都会有一个方法被调用,这个方法以线程安全的方式检查该值是否被初始化。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读