HoRain云--Scala循环全解析:从基础到高阶

  

🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

🔁 1. 基础 for 循环

⚠️ 2. While 与 Do-While 循环

🧰 3. 使用高阶函数替代循环 (函数式风格)

⏹️ 4. 循环控制 (Break & Continue)

💡 5. 如何选择循环方式?

💎 总结


img

Scala 提供了多种循环结构来满足不同的编程需求,从传统的 forwhile循环到更函数式的集合高阶函数操作。了解它们的特点和适用场景,可以帮助你写出更简洁、高效的 Scala 代码。

下面是 Scala 中主要循环方式的对比,帮助你快速了解:

循环类型

语法特点

适用场景

注意事项

for循环​

功能丰富,支持生成器、守卫、yield推导式

​遍历集合、序列​​,进行条件过滤和转换

是 ​​最常用​​ 的循环结构

while循环​

while(条件) { ... }

​条件满足时重复执行​​,循环次数不确定时

​无返回值​​,通常需要​​可变变量​​,易产生副作用

do-while循环​

do { ... } while(条件)

​至少执行一次​​,再检查条件

同样无返回值,需使用可变变量

​高阶函数​

集合.foreach(操作)集合.map(转换)

​函数式风格​​的集合遍历、转换和过滤

鼓励​​不可变​​和​​无副作用​​的操作


🔁 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 循环

whiledo-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 没有内置的 breakcontinue关键字。可以通过以下方式实现类似功能:

  • ​使用 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 风格​​的选择。

  • ​考虑高阶函数​​:对于简单的遍历、映射、过滤,直接使用 foreachmapfilter等高阶函数可能代码更简洁,意图更明确。

  • ​谨慎使用 while/do-while​​:只有在循环次数​​确实不确定​​(例如,读取输入直到满足条件)且高阶函数或 for循环难以清晰表达时才考虑它们。注意它们带来的可变性。

  • ​避免使用 break/continue​​:尽量通过条件过滤(守卫)、递归或将逻辑拆分来替代 breakcontinue,使代码更函数式、更易理解。


💎 总结

Scala 提供了多种工具来处理循环和迭代。​for推导式​​因其强大的功能和表达力成为最常用的工具。​​集合的高阶函数​​(如 map, filter)则是函数式编程风格的基石。​while​ 和 ​do-while​ 循环也有其适用场景,但应谨慎使用以避免不必要的可变状态。

希望这些信息能帮助你更好地理解和使用 Scala 中的循环!

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值