🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 | |
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! | |
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 | |
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 | |
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 | |
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
Scala 提供了多种循环结构来满足不同的编程需求,从传统的 for
和 while
循环到更函数式的集合高阶函数操作。了解它们的特点和适用场景,可以帮助你写出更简洁、高效的 Scala 代码。
下面是 Scala 中主要循环方式的对比,帮助你快速了解:
循环类型 | 语法特点 | 适用场景 | 注意事项 |
---|---|---|---|
| 功能丰富,支持生成器、守卫、 | 遍历集合、序列,进行条件过滤和转换 | 是 最常用 的循环结构 |
|
| 条件满足时重复执行,循环次数不确定时 | 无返回值,通常需要可变变量,易产生副作用 |
|
| 至少执行一次,再检查条件 | 同样无返回值,需使用可变变量 |
高阶函数 |
| 函数式风格的集合遍历、转换和过滤 | 鼓励不可变和无副作用的操作 |
🔁 1. 基础 for 循环
Scala 的 for
循环非常灵活,远不止简单的计数。
-
遍历范围:使用
to
(包含上限)或until
(不包含上限)定义范围。// 使用 to (包含10) for (i <- 1 to 10) { println(i) } // 使用 until (不包含10) for (i <- 1 until 10) { println(i) }
-
遍历集合:直接遍历数组、列表等集合。
val fruits = List("apple", "banana", "orange") for (fruit <- fruits) { println(fruit) }
-
循环守卫:在
for
循环中直接使用if
进行条件过滤,if
前没有分号。// 只打印偶数 for (i <- 1 to 10 if i % 2 == 0) { println(i) }
-
嵌套循环:多个生成器写在一起,用分号隔开。
for (i <- 1 to 3; j <- 1 to 3) { println(s"i=$i, j=$j") } // 另一种更清晰的写法 for { i <- 1 to 3 j <- 1 to 3 } { println(s"i=$i, j=$j") }
-
引入变量:在
for
循环内部定义临时变量。for { i <- 1 to 3 diff = 4 - i // 在循环内引入变量 j <- diff to 3 } { println(s"i=$i, diff=$diff, j=$j") }
-
for 推导式:使用
yield
将循环结果转换为一个新集合,这是for
循环非常强大的一个特性。val doubled = for (i <- 1 to 5) yield i * 2 println(doubled) // 输出: Vector(2, 4, 6, 8, 10)
⚠️ 2. While 与 Do-While 循环
while
和 do-while
更传统,常用于循环次数不确定的场景。但它们在 Scala 中不返回结果,且通常需要配合可变变量使用,因此在函数式风格中不常用。
-
while 循环:先判断条件,再决定是否执行循环体。
var count = 5 while (count > 0) { println(count) count -= 1 // Scala 没有 -- 操作符,使用 -= 1 }
-
do-while 循环:先执行一次循环体,再判断条件。
var input: String = "" do { print("请输入命令: ") input = StdIn.readLine() // 执行一些操作... } while (input != "quit")
🧰 3. 使用高阶函数替代循环 (函数式风格)
Scala 的集合类提供了许多高阶函数,能更简洁、表达力更强地实现循环操作,是函数式编程的首选。
-
foreach
:对集合中每个元素执行操作,无返回值(返回Unit
),常用于替代for
循环遍历打印。val list = List(1, 2, 3) list.foreach(println) // 打印每个元素
-
map
:转换集合中的每个元素,并返回一个新集合。val list = List(1, 2, 3) val doubled = list.map(_ * 2) // doubled: List(2, 4, 6)
-
filter
:过滤出集合中满足条件的元素,返回新集合。val list = List(1, 2, 3, 4, 5) val evens = list.filter(_ % 2 == 0) // evens: List(2, 4)
-
flatMap
:先对集合中每个元素进行映射(通常映射为集合),然后将这些集合“展平”成一个新集合。val numbers = List(1, 2, 3) val expanded = numbers.flatMap(i => List(i, i * 10)) // expanded: List(1, 10, 2, 20, 3, 30)
⏹️ 4. 循环控制 (Break & Continue)
Scala 没有内置的 break
和 continue
关键字。可以通过以下方式实现类似功能:
-
使用
scala.util.control.Breaks
:通过抛出和捕获异常实现中断。import scala.util.control.Breaks._ breakable { // 定义一个可中断块 for (i <- 1 to 10) { if (i == 5) break() // 当 i 为 5 时跳出整个 breakable 块 println(i) } } println("循环后")
-
使用条件判断和递归:更函数式的方式是使用递归函数和条件判断来控制流程,或者利用
for
循环的守卫来跳过某些元素(模拟continue
)。// 用 for 守卫模拟 continue,跳过偶数 for (i <- 1 to 10 if i % 2 != 0) { println(i) // 只打印奇数 }
💡 5. 如何选择循环方式?
-
首选
for
循环和推导式:当你需要遍历集合、进行条件过滤或转换数据并生成新集合时,for
循环(特别是带yield
的推导式)通常是最强大和最 Scala 风格的选择。 -
考虑高阶函数:对于简单的遍历、映射、过滤,直接使用
foreach
、map
、filter
等高阶函数可能代码更简洁,意图更明确。 -
谨慎使用 while/do-while:只有在循环次数确实不确定(例如,读取输入直到满足条件)且高阶函数或
for
循环难以清晰表达时才考虑它们。注意它们带来的可变性。 -
避免使用 break/continue:尽量通过条件过滤(守卫)、递归或将逻辑拆分来替代
break
和continue
,使代码更函数式、更易理解。
💎 总结
Scala 提供了多种工具来处理循环和迭代。for
推导式因其强大的功能和表达力成为最常用的工具。集合的高阶函数(如 map
, filter
)则是函数式编程风格的基石。while
和 do-while
循环也有其适用场景,但应谨慎使用以避免不必要的可变状态。
希望这些信息能帮助你更好地理解和使用 Scala 中的循环!
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙