Scala学习2: 控制结构和函数

目录

    • 第二章 控制结构和函数
      • 1- 条件表达式
      • 2- 语句终止
      • 3- 块表达式和赋值
      • 4- 输入和输出
      • 5- 循环
      • 6- 高级for循环和for推到式
      • 7- 函数
      • 8- 默认参数和带名参数
      • 9- 可变参数
      • 10- 过程
      • 11- 懒值
      • 12- 异常
      • end

第二章 控制结构和函数

1- 条件表达式

Scala的 if/esle 语法结构与java一样, 但是在Scala中 if/else 表达式有值, 这个值就是跟在 if 或 else 之后表达式的值.

我们可以将 if/esle 表达式的值赋值于变量:

    val x = 5val s = if (x > 0) 1 else -1println(s)  // 1
// 等价于val x = 5var z = 0if (x > 0) z = 1 else z = -1println(z) // 1

相比较, 第一种写法更好, 因为它可以用来初始化一个 val, 而第二种写法中, z 必须是 var;

在Scala中, 每个表达式都有一个类型;

如果是混合类型, 则类型为 Any;

如果 else 部分缺失, 例如:

      val y = -5val t = if (y > 0) 1println(t) // ()

等价于

      val y = -5val t = if (y > 0) 1 else ()println(t) // ()

Scala没有 Switch 语句, 但是它有一个更强大的模式匹配机制;

2- 语句终止

在Scala中, 语句的终止通常使用分号 (😉 来表示, 但是大多数情况下, 分号是可选的;

Scala具有自动分号插入(Automatic Semicolon Insertion) 的功能, 因此在大多数情况下, 可以省略分号而不会影响代码的执行;

然而, 有一些情况下需要显示使用分号来终止语句, 例如:

  • 在同一行写入多个语句时, 需要使用分号将他们分隔开;
  • 在一行的末尾是可以继续的语句时, 需要使用分号来明确终止该语句 .
    // 分号用于分隔多个语句val x = 1 ; val y = 2// 分号用于终止可以继续的语句if (x == 1) {println("x == 1") ; println("继续执行")}

3- 块表达式和赋值

在Scala中, 块表达式 (Block Expressions) 是由一对花括号 {} 包围的一系列表达式组成的结构;

在块表达式中, 最后一个表达式的值即为整个块表达式的值;

块表达式可以用于包含多个操作或计算步骤, 并且可以隐藏中间变量, 使代码更加清晰和简洁;

在块表达式中进行赋值时, 需要注意Scala中赋值语句的特性;

在Scala中, 赋值语句本身没有返回值, 或者严格来说, 其返回值为 Unit 类型 (类似于java中的void 类型);

因此, 如果一个块表达式以赋值语句结尾, 整个表达式的值将为 Unit 类型 ;

    val x = 10val y = {val a  = x + 5val b  = a * 2b}println(y) // 输出: 30val result = {var a = 5a += 1}println(result) // 输出: ()

4- 输入和输出

使用 print 或者 println 打印一个值;

使用 printf 格式化输出;

使用 readLine 从控制台读取一行输入, 如果是读取数字, Boolean 或者字符串, 可以使用 readInt, readDouble , readByte , readShort , readLong, readFloat, readBoolean或者 readChar;

与其它方法不同, readLine带一个参数作为提示字符串;

    println("请输入文本:")val input = StdIn.readLine()println("你输入的文本是: " + input)
请输入文本:
KFC
你输入的文本是: KFC

5- 循环

Scala支持 while 循环和 for 循环, while 循环与java的 while 一样, for 循环语法如下:

for(i <- 表达式)

遍历字符串和数组时, 你通常需要使用 0 到 n-1 的区间, 这个时候可以使用 until 方法而不是 to 方法;

until 方法返回一个并不包含上限的区间;

    for (i <- 1 to 10) { // 包含10, 1 - 10println(i)}
// 或者for (x <- 1 until 10) { // 不包含 10, 1 - 9println(x)}
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9

6- 高级for循环和for推到式

可以使用变量 <-表达式的形式提供多个生成器, 用分号隔开. 例如:

    for(i <- 1 to 3; j <- 1 to 3)println(10 * i + j)
11
12
13
21
22
23
31
32
33

每个生成器还可以带过滤条件, 以 if 开头的 Boolean 表达式;

    for(i <- 1 to 3; j <- 1 to 3 if i != j)println(10 * i + j)
12
13
21
23
31
32

如果 for循环的循环体以 yield开始, 则该循环会构造出一个集合, 每次迭代出集合中的一个值:

    val list = for (i <- 1 to 10) yield i % 3println(list)
Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)

这类循环叫做 for 推导式;

7- 函数

在Scala中, 函数是一等公民, 可以像变量一样被传递、赋值和使用;

Scala中的函数可以具有参数、返回值, 并且可以嵌套定义;

函数可以被定义为匿名函数(lambda表达式), 也可以被命名并在其它地方调用;

要定义函数, 需要给出函数的名称, 参数和函数体:

def abs(x:Double) = if (x>0) x else -x

必须给出所有参数的类型, 不过, 只要函数不是递归的, 就不需要指定返回类型;

Scala编译器可以通过=左右两侧的表达式推断出返回类型;

如果函数体需要多个表达式完成, 可以使用代码块, 块中最后一个表达式的值就是函数的返回值.

对于递归函数, 必须指定返回类型;

def abs(x: Double) = if (x>0) x else -x
// 调用函数
println(abs(2.12)) // 2.12
println(abs(-3)) // 3.0

8- 默认参数和带名参数

在Scala中, 可以使用带名参数和默认参数来提高代码的可以读性和灵活性;

带名参数允许在调用函数时指定参数的名称, 而不必按照函数定义的顺序传递参数;

默认参数允许在定义函数时为参数指定默认值, 如果调用函数时未提供该参数的值, 则会使用默认值;

示例:

//  定义一个函数, 带有默认值参数和带名参数
def greet(name: String = "Horld", greeting: String = "Hello"): Unit = {println(s"$greeting, $name!")
}// 调用函数,使用默认参数
greet() // 输出: Hello, World!
// 调用函数,使用带名参数
greet(greeting = "Hi", name = "Taerge") // 输出: Hi, Taerge!

在上面的示例中, greet函数定义了两个带有默认值的参数 namegreeting, 在调用函数时, 可以使用默认参数, 也可以通过指定参数的名称来传递参数值 .

9- 可变参数

在Scala中, 可变参数允许函数接受可变数量的参数;

这种特性使得函数可以接受任意数量的参数, 而不需要提前确定参数的数量;

可变参数在Scala中使用 * 来定义, 通常称为可变参数, 变长参数和可变长度参数;

示例:

  // todo: 定义一个函数, 接受可变参数的函数def sum(args: Int*): Int = {var result = 0for (arg <- args) {result += arg}result}// 调用函数, 传递不定量的参数println(sum(1, 2, 3)) // 输出: 6println(sum(1, 2, 3, 4, 5)) // 输出: 15

在上面的示例中, sum 函数接受一个或多个整数作为参数, 并计算他们的总和;

通过在参数类型后面加上* , 函数就可以接受不定数量的参数;

在调用函数时, 可以传递任意数量的参数, 这些参数会被收集成一个序列;

使用可变参数可以使函数更加灵活, 适用于需要处理不定数量参数的情况 .

10- 过程

在Scala中, 不返回值的函数有一种特殊的表示法, 即定义为过程(Procedure) ;

过程是指函数体包含在花括号中, 但没有等号= 来指定返回类型, 此时函数的返回类型被推断为 Unit;

过程在Scala中用于执行一些操作而不返回任何值;

示例:

  // todo: 定义一个过程, 不返回任何值def printHello(): Unit = {println("Hello, World!")}// 调用过程printHello() // 输出: Hello, World!

在上面示例中, printHello() 函数是一个过程, 它打印 “Hello, World!” 而不返回任何值;

过程在Scala中通常用于执行副作用操作, 如打印, 写入文件等, 而不需要返回结果;

通过定义过程, 可以明确表明函数的目的是执行一些操作而不产生返回值, 这有助于代码的可读性和清晰性 .

11- 懒值

在Scala中, 懒值 (lazy val) 是一种延迟初始化的特性, 它允许变量在首次访问时才进行初始化;

懒值的声明使用 lazy 关键字, 这样可以推迟变量的初始化, 直到第一次访问该变量时才进行实际的计算或赋值;

示例:

  // todo: 定义一个类class Person {// 声明一个懒值lazy val age: Int = {println("lazy value age is called")22}}// 创建一个对象val person = new Person// 访问懒值println(person.age) // 第一次访问, 会初始化并输出: lazy value age is called , 输出: 22println("-------------") // 输出: -------------println(person.age) // 第二次访问, 不会重新初始化, 直接输出: 22

在上面的示例中, age 被声明为懒值, 只有在第一次访问 age 时才会执行初始化代码;

懒值通常用于延迟初始化开销较大的变量, 以提高性能和资源利用率;

懒值在Scala中是一种常用的技术, 可以帮助优化程序性能和资源利用 .

12- 异常

在Scala中, 异常处理是通过 trycatchfinally 来实现的;

Scala中的异常分为可检查异常 (checked exception) 和不可检查异常 (unchecked exception) ;

Scala不强制要求捕获或声明可检查异常, 因此通常情况下, Scala中的异常处理更接近于 java中的不可检查异常处理;

示例:

  // todo: 异常try {// 可能会抛出异常的代码val result = 1 / 0} catch {case e: Exception =>// 处理异常的代码println("除0异常发生: " + e.getMessage) // 输出: 除0异常发生: / by zero} finally {println("无论如何都会执行的代码") // 输出: 无论如何都会执行的代码// 释放资源的代码println("释放资源") // 输出: 释放资源}

在上面的示例中, try 块包含可能会抛出异常的代码, catch 块用于捕获特定类型的异常并处理, finally 块中的代码无论如何是否发生异常都会执行;

除了 trycatchfinally , Scala还提供了 throw 关键字用于抛出异常. 另外, Scala中也支持使用 match 表达式来处理异常, 使异常处理更加灵活;

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL表突然卡死,删、查操作加载不停解决办法

今天遇到了MySQL删表的时候卡死情况。然后通过网上查阅资料和项目组沟通&#xff0c;了解到了有多人同时对同一张表进行了操作。我和另一个同事同时进行了删除操作&#xff0c;然后另两位同时进行了查询操作&#xff0c;然后还有一位同事用dolphin调度&#xff0c;用datax采集数…

【SQL】SQL常见面试题总结(4)

目录 1、空值处理1.1、统计有未完成状态的试卷的未完成数和未完成率1.2、0 级用户高难度试卷的平均用时和平均得分 2、高级条件语句2.1、筛选限定昵称成就值活跃日期的用户&#xff08;较难&#xff09;2.2、筛选昵称规则和试卷规则的作答记录&#xff08;较难&#xff09;2.3、…

SmartEDA助力电工基础实验:打造高效、智能的学习新体验

在电工基础实验的教学与学习中&#xff0c;传统的实验设备往往存在着操作复杂、数据处理繁琐等问题&#xff0c;给学生的学习带来了不小的挑战。然而&#xff0c;随着科技的不断发展&#xff0c;一种名为SmartEDA的智能电工实验辅助设备正逐渐走入课堂&#xff0c;以其高效、智…

Es6-对象新增了哪些扩展?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Javascript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Javascript篇专栏内容:Es6-对象新增了哪些扩展&#xff1f; 目录 一、参数 二、属性 函数的length属性 …

Unsupervised Out-of-Distribution Detection with Diffusion Inpainting

Unsupervised Out-of-Distribution Detection with Diffusion Inpainting 摘要1.介绍2 背景3 3. Lift, Map, Detect摘要 无监督的异常分布检测(OOD)旨在通过仅从未标记的域内数据中学习来识别域外数据。我们提出了一种用于此任务的新方法——提升、映射、检测(LMD),该方法…

数据结构-栈(带图)

目录 栈的概念 画图理解栈 栈的实现 fun.h fun.c main.c 栈的概念 栈&#xff08;Stack&#xff09;是一种基本的数据结构&#xff0c;其特点是只允许在同一端进行插入和删除操作&#xff0c;这一端被称为栈顶。遵循后进先出&#xff08;Last In, First Out, LIFO&#…

浏览器下载附件流建议

大文件下载可采用附件流的方式&#xff0c;后端设置一下响应参数&#xff0c;然后以流的方式返回前端 res.set({ "Content-Type": "application/octet-stream", "Content-Disposition": "attachment;filename* UTF-8"fixedEncodeUR…

【论文粗读|arXiv】GaSpCT: Gaussian Splatting for Novel CT Projection View Synthesis

Abstract 本文提出了一种新颖的视图合成和3D场景表示方法&#xff0c;用于为计算机断层扫描&#xff08;CT&#xff09;生成新的投影视图。 方法采用了Gaussian Splatting 框架&#xff0c;基于有限的2D图像投影集&#xff0c;无需运动结构&#xff08;SfM&#xff09;方法&am…

CSPM-4是什么?报考条件有哪些?

2021年10月&#xff0c;《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项目管理专业人员能力评价…

Swift 5.9 中 if 与 switch 语句简洁新语法让撸码更带劲

概览 在实际代码开发中&#xff0c;可能初学 Swift 语言的小伙伴们在撸码时最常用的得数 if 和 switch…case 条件选择语句了。不过在某些场景下它们显得略有那么一丢丢“矫揉造作”&#xff0c;还好从 Swift 5.9 开始苹果知趣的为其简化了语法且增强了它们的表现力。 在本篇…

Vitis HLS 学习笔记--优化本地存储器访问瓶颈

目录 1. 简介 2. 代码解析 2.1 原始代码 2.2 优化后 2.3 分析优化措施 3. 总结 1. 简介 在Vitis HLS中&#xff0c;实现II&#xff08;迭代间隔&#xff09; 1是提高循环执行效率的关键。II1意味着每个时钟周期都可以开始一个新的迭代&#xff0c;这是最理想的情况&…

Java实现音频转文本(语音识别)

在Java中实现音频转文本&#xff08;也称为语音识别或ASR&#xff09;通常涉及使用专门的语音识别服务&#xff0c;如Google Cloud Speech-to-Text、IBM Watson Speech to Text、Amazon Transcribe、Microsoft Azure Speech Services&#xff0c;或者一些开源库如CMU Sphinx。 …

2024年第四届长三角高校数学建模竞赛C题思路

赛道C:汽后配件需求预测问题 在汽后行业的供应链管理中, 精准的需求预测是后续管理及决策的基础。 各个汽后配件即为一个库存单位(SKU, Stock Keeping Unit), 如果可以准确预知未来对于各个配件的市场需求, 就可以提前将库存放在靠近需求的仓库中, 从而降低库存成本,…

HNCTF ——baby_python

H&NCTF 2024 官方WP (qq.com) OpCodes Pickle.jl (juliahub.com) nc之后 PS D:\ForCode\pythoncode\.idea> nc hnctf.yuanshen.life 33267 # Python 3.10.12 from pickle import loads main b"\x80\x04ctypes\nFunctionType\n(ctypes\nCodeType\n(I1\nI0\nI0\n…

[Linux] 常用服务器命令(持续更新)

文件操作 # 显示文件系统的磁盘空间使用情况 df -h全局查找文件 find / -type f -iname "java"find / -name libncurses*拷贝整个文件夹 cp -r /home/a/ /home/b/ 解压&#xff0c;撤销解压 撤销zip解压 zipinfo -1 path/xx.zip | xargs rm -rf 撤销tar解压 tar …

【Vim】

一、什么是Vim&#xff1f; Vim 是一个历史悠久的文本编辑器&#xff0c;可以追溯到 qed。 Bram Moolenaar 于 1991 年发布初始版本。Vim 有着悠久的历史;它起源于 Vi 编辑器&#xff08;1976 年&#xff09;&#xff0c;至今仍在开发中。(Vim has a rich history; it origina…

css+html 爱心❤

效果 代码实现 html <div class"main"><div class"aixin"></div></div>css .main {transform: rotate(-45deg);}.aixin {height: 100px;width: 100px;background-color: red;margin: auto;margin-top: 200px;position: relativ…

MySQL第一次作业(基本操作)

目录 一、登陆数据库 二、创建数据库zoo 三、修改数据库zoo字符集为gbk 四、选择当前数据库为zoo 五、查看创建数据库zoo信息 六、删除数据库zoo 一、登陆数据库 指令&#xff1a; mysql -u root -p 二、创建数据库zoo 指令&#xff1a; create database zoo; 三、修改数…

基于PHP+MySQL组合开发的多用户自定义商城系统源码 附带源代码包以及搭建教程

系统概述 互联网技术的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。商城系统作为电子商务的核心&#xff0c;其开发技术和用户体验直接影响着电商平台的竞争力和用户满意度。本文旨在介绍一个基于PHPMySQL组合开发的多用户自定义商城系统&#xff0c;…

C++学习~~string类

1.STL简单介绍 &#xff08;1&#xff09;标准模版库&#xff0c;是C里面的标准库的一部分&#xff0c;C标准库里面还有其他的东西&#xff0c;但是我们不经常使用&#xff0c;我们经常使用的还是STL这个标准库部分。 &#xff08;2&#xff09;六大件&#xff1a;仿函数&…