首页 > 其他分享 >Scala控制结构和函数、过程、懒值、异常

Scala控制结构和函数、过程、懒值、异常

时间:2022-11-11 16:34:23浏览次数:51  
标签:函数 示例 懒值 Scala 控制结构 content def println 表达式


1  if else表达式

scala中没有三目运算符,因为根本不需要。scala中if else表达式是有返回值的,如果if或者else返回的类型不一样,就返回Any类型(所有类型的公共超类型)。

例如:if else返回类型一样

val a3 = 10
val a4 =
if(a3 > 20){
"a3大于20"
}else{
"a3小于20"
}
println(a4)

例如:if else返回类型不一样

val a5 =
if(a3 > 20){
"a3大于20"
}
println(a5)

如果缺少一个判断,什么都没有返回,但是Scala认为任何表达式都会有值,对于空值,使用Unit类,写做(),叫做无用占位符,相当于java中的void。

尖叫提示:行尾的位置不需要分号,只要能够从上下文判断出语句的终止即可。但是如果在单行中写多个语句,则需要分号分割。在Scala中,{}快包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。

2  while表达式

Scala提供和Java一样的while和do循环,与If语句不同,While语句本身没有值,即整个While语句的结果是Unit类型的()。

1) while循环

var n = 1;
val while1 = while(n <= 10){
n += 1
}

println(while1)
println(n)

2) while循环的中断

import scala.util.control.Breaks
val loop = new Breaks
loop.breakable{
while(n <= 20){
n += 1;
if(n == 18){
loop.break()
}
}
}
println(n)

尖叫提示:scala并没有提供break和continue语句来退出循环,如果需要break,可以通过几种方法来做1、使用Boolean型的控制变量 2、使用嵌套函数,从函数中return 3、使用Breaks对象的break方法。

3  for表达式

Scala 也为for 循环这一常见的控制结构提供了非常多的特性,这些for 循环的特性被称为for 推导式(for comprehension)或for 表达式(for expression)。

1) for示例1:to左右两边为前闭后闭的访问

for(i <- 1 to 3; j <- 1 to 3){
print(i * j + " ")
}
println()

2) for示例2:until左右两边为前闭后开的访问

for(i <- 1 until 3; j <- 1 until 3) {
print(i * j + " ")
}
println()

3) for示例3:引入保护式(也称条件判断式)该语句只打印1 3。保护式满足为true则进入循环内部,满足为false则跳过,类似于continue

for(i <- 1 to 3 if i != 2) {
print(i + " ")
}
println()

4) for示例4:引入变量

for(i <- 1 to 3; j = 4 - i) {
print(j + " ")
}
println()

5) for示例5:将遍历过程中处理的结果返回到一个,使用yield关键字

val for5 = for(i <- 1 to 10) yield i
println(for5)

6) for示例6:使用花括号{}代替小括号()

for{
i <- 1 to 3
j = 4 - i}
print(i * j + " ")
println()

尖叫提示:{}和()对于for表达式来说都可以。for 推导式有一个不成文的约定:当for 推导式仅包含单一表达式时使用原括号,当其包含多个表达式时使用大括号。值得注意的是,使用原括号时,早前版本的Scala 要求表达式之间必须使用分号。

4  函数

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

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

1) 函数示例1:返回Unit类型的函数

def shout1(content: String) : Unit = {
println(content)
}

2) 函数示例2:返回Unit类型的函数,但是没有显式指定返回类型。(当然也可以返回非Unit类型的值)

def shout2(content: String) = {
println(content)
}

3) 函数示例3:返回值类型有多种可能,此时也可以省略Unit

def shout3(content: String) = {
if(content.length >= 3)
content + "喵喵喵~"
else
3
}

4) 函数示例4:带有默认值参数的函数,调用该函数时,可以只给无默认值的参数传递值,也可以都传递,新值会覆盖默认值;传递参数时如果不按照定义顺序,则可以通过参数名来指定。

def shout4(content: String, leg: Int = 4) = {
println(content + "," + leg)
}

5) 函数示例5:变长参数(不确定个数参数,类似Java的...

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

6) 递归函数:递归函数在使用时必须有明确的返回值类型

def factorial(n: Int): Int = {
if(n <= 0)
1
else
n * factorial(n - 1)
}

尖叫提示:

1、Scala可以通过=右边的表达式  推断出函数的返回类型。如果函数体需要多个表达式,可以用代码块{}。

2、可以把return 当做  函数版本的break语句。

3、递归函数一定要指定返回类型。

4、变长参数通过* 来指定,所有参数会转化为一个seq序列。

5  过程

我们将函数的返回类型为Unit的函数称之为过程。

1) 定义过程示例1

def shout1(content: String) : Unit = {
println(content)
}

2) 定义过程示例2

def shout1(content: String) = {
println(content)
}

3) 定义过程示例3

def shout1(content: String) {
println(content)
}

尖叫提示:这只是一个逻辑上的细分,如果因为该概念导致了理解上的混淆,可以暂时直接跳过过程这样的描述。毕竟过程,在某种意义上也是函数。

6  懒值

当val被声明为lazy时,他的初始化将被推迟,直到我们首次对此取值,适用于初始化开销较大的场景。

1) lazy示例:通过lazy关键字的使用与否,来观察执行过程

object Lazy {

def init(): String = {
println("init方法执行")
"嘿嘿嘿,我来了~"
}

def main(args: Array[String]): Unit = {
lazy val msg = init()
println("lazy方法没有执行")
println(msg)
}
}

7  异常

当碰到异常情况时,方法抛出一个异常,终止方法本身的执行,异常传递到其调用者,调用者可以处理该异常,也可以升级到它的调用者。运行系统会一直这样升级异常,直到有调用者能处理它。 如果一直没有处理,则终止整个程序。

Scala的异常的工作机制和Java一样,但是Scala没有“checked”异常,你不需要声明说函数或者方法可能会抛出某种异常。受检异常在编译器被检查,java必须声明方法所会抛出的异常类型。

抛出异常:用throw关键字,抛出一个异常对象。所有异常都是Throwable的子类型。throw表达式是有类型的,就是Nothing,因为Nothing是所有类型的子类型,所以throw表达式可以用在需要类型的地方。

捕捉异常:在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case字句。

异常捕捉的机制与其他语言中一样,如果有异常发生,catch字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处。

finally字句用于执行不管是正常处理还是有异常发生时都需要执行的步骤,一般用于对象的清理工作。

1) 异常示例:

object ExceptionSyllabus {

def divider(x: Int, y: Int): Float= {
if(y == 0) throw new Exception("0作为了除数")
else x / y
}

def main(args: Array[String]): Unit = {
try {
println(divider(10, 3))
} catch {
case ex: Exception => println("捕获了异常:" + ex)
} finally {}
}
}

标签:函数,示例,懒值,Scala,控制结构,content,def,println,表达式
From: https://blog.51cto.com/u_12654321/5845143

相关文章

  • Scala模式匹配
    1 switch与default等效的是捕获所有的case_模式。如果没有模式匹配,抛出MatchError,每个case中,不用break语句。可以在match中使用任何类型,而不仅仅是数字。varresult=0;......
  • Scala数据结构
    1 数据结构特点Scala同时支持可变集合和不可变集合,不可变集合从不可变,可以安全的并发访问。两个主要的包:不可变集合:scala.collection.immutable可变集合: scala.collecti......
  • Scala 类
    1 简单类和无参方法类的定义可以通过class关键字实现,如下:packageunit7classDog{privatevarleg=4defshout(content:String){println(content)}def......
  • Scala高阶函数
    1 作为参数的函数函数作为一个变量传入到了另一个函数中,那么该作为参数的函数的类型是:function1,即:(参数类型)=>返回类型defplus(x:Int)=3+xvalresult1=Array(1,......
  • Scala注解
    注解就是标签。标签是用来标记某些代码需要特殊处理的。处理的手段可以在代码运行时操作,也可以在编译期操作。1 什么可以被注解1) 可以为类,方法,字段局部变量,参数,表达式,......
  • 【THM】Linux Privilege Escalation(Linux权限提升基础)-学习
    本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/linprivesc通过学习相关知识点:了解Linux权限提升的基础知识,从枚举到利用,了解多种不同的权限提升技术。介......
  • Scalable Evaluation of Multi-Agent Reinforcement Learning with Melting Pot
    提出的问题:现有的对多智能体强化学习的评估工具没有将多智能体强化学习泛化的新情况评估作为主要目标。传统的监督学习和受益于明确的实验环境和存在的评价基准,能够较为......
  • [scala基础]--拆分List操作
    运行环境:Jdk1.7、scala-2.10.4packagestudy/***Document:本类作用---->拆分List*User:yangjf*Date:2016/8/148:57*/objectTestArrays{defmain(args:A......
  • Spark简单介绍,Windows下安装Scala+Hadoop+Spark运行环境,集成到IDEA中
    一、前言近几年大数据是异常的火爆,今天小编以java开发的身份来会会大数据,提高一下自己的层面!大数据技术也是有很多:HadoopSparkFlink小编也只知道这些了,由于Hadoop,......
  • 【scala】getclass的使用
    打印属性名判断是否有该属性......