Scala 新手實戰三案例:從循環到條件,搞定基礎編程場景

Scala 新手實戰三案例:從循環到條件,搞定基礎編程場景

對 Scala 新手來說,單純記語法容易 “學完就忘”,而通過小而精的實戰案例鞏固知識點,是掌握語言的關鍵。本文精選三個高頻基礎場景 ——9 乘 9 乘法口訣表、成績等級評定、整數約數查找,每個案例都覆蓋 Scala 核心語法(循環、條件、集合、輸入輸出),并附帶代碼解析和運行驗證,幫你真正理解 “代碼為什么這么寫”。

一、案例一:9 乘 9 乘法口訣表(掌握嵌套循環與字符串格式化)

1.1 需求分析

輸出標準乘法口訣表:

  • 共 9 行,第i行包含i個乘法表達式(如第 3 行:1×3=3、2×3=6、3×3=9)

  • 表達式對齊,格式整潔(避免因數字位數導致錯位)

1.2 完整代碼(含注釋)

object MultiplicationTable {?def main(args: Array[String]): Unit = {?// 外層循環:控制行數(i從1到9,閉區間用to)?for (i <- 1 to 9) {?// 內層循環:控制每行的列數(j從1到i,確保第i行有i個表達式)?for (j <- 1 to i) {?// 字符串插值(s"")+ 制表符(\t):既簡化拼接,又保證對齊?print(s"$j×$i=${j * i}\t")?}?// 每行結束后換行?println()?}?}?
}

1.3 核心知識點拆解(新手必懂)

  1. Scala 的 for 循環特性
  • 1 to 9生成閉區間(包含 1 和 9),若用1 until 9則是左閉右開(包含 1,不包含 9),這里需用to才夠 9 行。

  • 嵌套循環邏輯:外層i控制 “被乘數”(如第 3 行所有表達式的第二個數都是 3),內層j控制 “乘數”(從 1 遞增到i)。

  1. 字符串插值(s"")

    相比 Java 的"$j×$i=" + (j*i),Scala 的s""可直接在字符串中嵌入變量($變量名)或表達式(${表達式}),代碼更簡潔,且不易出錯。

  2. 制表符(\t)的作用

    每個表達式后加\t,會讓輸出按 “制表位” 對齊(無論j*i是 1 位還是 2 位,都能保持列對齊),最終輸出格式整齊。

1.4 運行結果(IDEA 中直接右鍵運行)

在這里插入圖片描述

二、案例二:成績等級評定(掌握條件表達式嵌套與返回值特性)

2.1 需求分析

根據輸入的整數成績(0-100 分)評定等級:

  • 90 分及以上 → A(優秀)

  • 60-89 分 → B(及格)

  • 60 分以下 → C(不及格)

  • 需處理邊界值(如 60 分、90 分),且代碼邏輯清晰。

2.2 兩種實現方案(對比學習)

Scala 的條件表達式是 “有返回值的”,因此有兩種常見寫法,可根據場景選擇:

方案 1:嵌套 if-else(適合復雜多層判斷)
object GradeEvaluator {?def main(args: Array[String]): Unit = {?// 測試多個分數(用List存儲,便于批量驗證)?val scores = List(95, 80, 60, 55, 100, 0)??// 遍歷分數,調用評級函數并打印結果?scores.foreach(score => {?val grade = getGradeByNested(score)?println(s"分數 $score → 等級 $grade")?})?}?
?// 嵌套if-else實現:先判斷是否及格,再判斷是否優秀?def getGradeByNested(score: Int): Char = {?if (score >= 60) { // 第一層:是否及格?if (score >= 90) 'A' // 第二層:及格中是否優秀?else 'B' // 及格但不優秀?} else {?'C' // 不及格?}?}?
}
方案 2:else if(適合扁平多層判斷)

若判斷條件是 “互斥且有序” 的,用else if更簡潔,邏輯更直觀:

// 新增else if實現的函數(替換上述getGradeByNested即可)?
def getGradeByElseIf(score: Int): Char = {?if (score >= 90) 'A'       // 優先級1:先判斷最高等級?else if (score >= 60) 'B'  // 優先級2:再判斷及格?else 'C'                   // 優先級3:最后判斷不及格?
}

2.3 核心知識點拆解

  1. Scala 條件表達式的 “返回值特性”

    Java 中if-else是 “語句”(無返回值,需用return手動返回),而 Scala 中if-else是 “表達式”(每個分支的結果就是返回值,無需return)。

    例:val grade = if (score >=90) 'A' else 'B' 完全合法,grade會直接接收分支結果。

  2. 兩種判斷邏輯的選擇場景

  • 嵌套if-else:適合 “先過濾大類,再細分小類” 的場景(如先判斷 “是否成年”,再判斷 “是否滿 30 歲”)。

  • else if:適合 “按優先級排序” 的判斷(如成績等級從高到低判斷),代碼更扁平,可讀性更高。

  1. List 遍歷與 foreach

    scores.foreach(...)替代for (score <- scores),是 Scala 函數式編程的初步體現(將 “遍歷” 邏輯封裝為方法),代碼更簡潔。

2.4 運行結果

兩種方案輸出一致,邊界值處理正確:

分數 95 → 等級 A分數 80 → 等級 B分數 60 → 等級 B分數 55 → 等級 C分數 100 → 等級 A分數 0 → 等級 C

三、案例三:整數約數查找(掌握輸入輸出、特殊處理與集合篩選)

3.1 需求分析

  • 接收用戶輸入的整數(支持正、負、0)

  • 找出該整數的所有約數,存儲到數組中

  • 打印數組(格式友好,如[1, 2, 3, 6]

  • 特殊處理:0 有無限個約數,需提示用戶。

3.2 完整代碼(含異常場景處理)

object DivisorFinder {?def main(args: Array[String]): Unit = {?def findDivisors(n: Int): Array[Int] = {?// 特殊處理1:0有無限個約數,返回空數組并提示?if (n == 0) {?println("??  注意:0有無限個約數,無法全部列出")?return Array.empty[Int] // 返回空數組?}?
?// 特殊處理2:負數的約數與絕對值的約數相同,先取絕對值?val absNum = math.abs(n)?
?// 篩選約數:從1到absNum,過濾出能整除absNum的數?// (1 to absNum):生成整數序列;filter:篩選符合條件的元素;toArray:轉為數組?(1 to absNum).filter(i => absNum % i == 0).toArray?}?
}

3.3 核心知識點拆解

  1. Scala 標準輸入(StdIn)

    scala.io``.StdIn.readInt()直接讀取整數輸入,無需像 Java 那樣創建Scanner對象,代碼更簡潔。若需讀取字符串,可用readLine()

  2. 特殊場景處理

  • 0 的約數:數學上 0 能被任意非零整數整除,因此約數無限,程序主動提示并返回空數組,避免邏輯錯誤。

  • 負數的約數:約數是 “整除” 的概念,與正負無關(如 - 12 的約數和 12 的約數相同),用math.abs(n)取絕對值,統一處理邏輯。

  1. 集合篩選(filter)與類型轉換
  • (1 to absNum)生成 “整數序列”(Range 類型),不是數組。

  • filter(i => absNum % i == 0):遍歷序列,保留 “能整除 absNum” 的元素(i 是約數的條件)。

  • toArray:將篩選后的序列轉為數組,滿足 “存儲到數組” 的需求。

  1. 數組格式化打印(mkString)

    數組默認打印格式是[I@6d06d69c(內存地址),用mkString(prefix, separator, suffix)可自定義格式:

  • prefix:開頭字符(如[

  • separator:元素間分隔符(如,

  • suffix:結尾字符(如]

3.4 運行結果(多場景測試)

場景 1:輸入正數(如 12)
請輸入一個整數:12整數 12 的所有約數:\[1, 2, 3, 4, 6, 12]
場景 2:輸入負數(如 - 18)
請輸入一個整數:-18整數 -18 的所有約數:\[1, 2, 3, 6, 9, 18]
場景 3:輸入 0
請輸入一個整數:0??  注意:0有無限個約數,無法全部列出整數 0 的所有約數:\[]

四、三個案例的共性 Scala 特性總結

通過三個案例,你能發現 Scala 的核心設計思想,這些特性會貫穿后續所有編程場景:

特性案例體現優勢
表達式導向條件表達式返回值、for 循環生成序列無需return,代碼簡潔,減少冗余
函數式編程初步List.foreachRange.filter封裝遍歷 / 篩選邏輯,代碼更易讀
簡潔的 API 設計StdIn.readInt()mkStringmath.abs避免重復造輪子,開發效率高
類型轉換便捷toArrayto/until生成序列集合間轉換靈活,滿足不同場景需求
異常場景友好處理0 的約數提示、負數絕對值處理程序魯棒性強,減少崩潰風險

五、新手進階建議:基于案例擴展練習

學會 “修改代碼” 比 “看懂代碼” 更重要,推薦幾個擴展方向,幫你深化理解:

  1. 乘法表擴展

    輸出 “倒序乘法表”(從 9 行到 1 行),只需將外層循環改為for (i <- 9 to 1 by -1)by -1表示步長為 - 1,反向遍歷)。

  2. 成績等級擴展

    增加 D 級(40-59 分)和 E 級(40 分以下),用else if補充判斷邏輯,測試邊界值(如 40 分、59 分)。

  3. 約數擴展

    給約數數組去重(如輸入 16,約數是 [1,2,4,8,16],無重復,可模擬輸入重復場景)、按降序排序(在toArray后加.sorted(Ordering[Int].reverse))。

結語

Scala 的學習核心是 “先實戰,再歸納”。這三個案例覆蓋了新手最常用的語法場景,建議你在 IDEA 中逐行敲寫代碼,嘗試修改邏輯(如改循環條件、加判斷分支),觀察輸出變化 —— 只有動手實踐,才能真正掌握 Scala 的靈活與高效。后續可深入學習 Scala 的集合框架(List、Map)和函數式編程(匿名函數、高階函數),逐步解鎖更多高級特性!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96754.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java學習筆記----標識符與變量

1.什么是標識符?Java中變量、方法、類等要素命名時使用的字符序列&#xff0c;稱為標識符。 技巧:凡是自己可以起名字的地方都叫標識符。 比如:類名、方法名、變量名、包名、常量名等 2.標識符的命名規則由26個英文字母大小寫&#xff0c;0-9&#xff0c;或$組成 數字不可以開…

AI產品經理面試寶典第93天:Embedding技術選型與場景化應用指南

1. Embedding技術演進全景解析 1.1 稀疏向量:關鍵詞匹配的基石 1.1.1 問:請說明稀疏向量的適用場景及技術特點 答:稀疏向量適用于關鍵詞精確匹配場景,典型實現包括TF-IDF、BM25和SPLADE。其技術特征表現為50,000+高維向量且95%以上位置為零值,通過余弦或點積計算相似度…

【Mermaid.js】從入門到精通:完美處理節點中的空格、括號和特殊字符

文章標簽&#xff1a; Mermaid, Markdown, 前端開發, 數據可視化, 流程圖 文章摘要&#xff1a; 你是否在使用 Mermaid.js 繪制流程圖時&#xff0c;僅僅因為節點文本里加了一個空格或括號&#xff0c;整個圖就渲染失敗了&#xff1f;別擔心&#xff0c;這幾乎是每個 Mermaid 新…

多技術融合提升環境生態水文、土地土壤、農業大氣等領域的數據分析與項目科研水平

一&#xff1a;空間數據獲取與制圖1.1 軟件安裝與應用1.2 空間數據介紹1.3海量空間數據下載1.4 ArcGIS軟件快速入門1.5 Geodatabase地理數據庫二&#xff1a;ArcGIS專題地圖制作2.1專題地圖制作規范2.2 空間數據的準備與處理2.3 空間數據可視化&#xff1a;地圖符號與注記2.4 研…

【音視頻】Android NDK 與.so庫適配

一、名詞解析 名詞全稱核心說明Android NDKNative Development Kit在SDK基礎上增加“原生”開發能力&#xff0c;支持使用C/C編寫代碼&#xff0c;用于開發需要調用底層能力的模塊&#xff08;如音視頻、加密算法等&#xff09;.so庫Shared Object即共享庫&#xff0c;由NDK編…

SpringBoot 輕量級一站式日志可視化與JVM監控

一、項目初衷Java 應用開發的同學都知道&#xff0c;項目上線后&#xff0c;日志的可視化查詢與 JVM 的可視化監控是一件非常重要的事。 市面上成熟方案一般是采用 ELK/EFK 實現日志可視化&#xff0c;采用 Actuator Prometheus Grafana 實現 JVM 監控。 這兩套都是非常優秀的…

【Leetcode hot 100】101.對稱二叉樹

問題鏈接 101.對稱二叉樹 問題描述 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,2,3,4,4,3] 輸出&#xff1a;true 示例 2&#xff1a; 輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;…

Zynq開發實踐(FPGA之選擇開發板)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】我們之所以選用zynq開發板&#xff0c;就在于它支持arm軟件開發&#xff0c;也支持fpga開發&#xff0c;甚至可以運行linux&#xff0c;這是之前沒有…

Flutter Riverpod 3.0 發布,大規模重構下的全新狀態管理框架

在之前的 《注解模式下的 Riverpod 有什么特別之處》我們聊過 Riverpod 2.x 的設計和使用原理&#xff0c;同時當時我們就聊到作者已經在開始探索 3.0 的重構方式&#xff0c;而現在隨著 Riverpod 3.0 的發布&#xff0c;riverpod 帶來了許多細節性的變化。 當然&#xff0c;這…

Xcode 上傳 ipa 全流程詳解 App Store 上架流程、uni-app 生成 ipa 文件上傳與審核指南

對于 iOS 開發者而言&#xff0c;應用開發完成后最重要的一步就是將應用打包為 ipa 文件&#xff0c;并上傳至 App Store Connect 進行分發或上架。 其中&#xff0c;Xcode 上傳 ipa 是最常見的方法&#xff0c;但很多開發者在實際操作中常常遇到卡住、上傳失敗或簽名錯誤等問題…

快速選中對象

圖片要求 圖片背景單純&#xff0c;對象邊緣比較清晰 對象選擇工具 選擇對象選擇工具后&#xff0c;畫出大致區域&#xff0c;系統將自動分析圖片內容&#xff0c;從而實現快速選擇圖片中的一個惑多個對象他有兩種模式&#xff0c;分別是舉行與套索模式。使用時可以先選中對象的…

點到點鏈路上的OSPF動態路由(2025年9月10日)

一、前言前面我們已經分享過了靜態路由、缺省路由、浮動靜態路由這些靜態路由的配置。接下來將會 陸陸續續開始分享動態路由以及其他路由配置。博主這里是一個新人&#xff0c;了解這些路由配置不是自上而下的&#xff0c;而是自下而上的&#xff0c;也就是說通過實驗去理解原理…

技術視界 | 末端執行器:機器人的“手”,如何賦予機器以生命?

在現代自動化系統中&#xff0c;末端執行器&#xff08;End Effector&#xff09;作為機器人與物理世界交互的“手”&#xff0c;發揮著至關重要的作用。它直接安裝在機械臂末端&#xff0c;不僅是機器人實現“抓取、感知和操作”三大核心功能的關鍵部件&#xff0c;更是整個自…

滑動窗口概述

滑動窗口算法簡介滑動窗口是一種用于處理數組或字符串子區間問題的高效算法。它通過維護一個動態窗口&#xff08;通常由兩個指針表示&#xff09;來避免重復計算&#xff0c;將時間復雜度從O(n)優化到O(n)。基本實現步驟初始化窗口指針&#xff1a;通常使用left和right指針表示…

AI 創建學生管理系統

使用騰訊元寶創建&#xff0c;整體效果不錯。修正2個bug跑起來&#xff0c;達到了需要的功能先上效果圖&#xff1a;按鈕分類別配色&#xff0c;界面清爽。喜歡這布局創建過程&#xff1a;prompt: 使用最新穩定vue版&#xff0c;使用pinia存儲&#xff0c;基于typescript, 樣式…

ASP.NET Core 中的簡單授權

ASP.NET Core 中的授權通過 [Authorize] 屬性及其各種參數控制。 在其最基本的形式中&#xff0c;通過向控制器、操作或 [Authorize] Page 應用 Razor 屬性&#xff0c;可限制為僅允許經過身份驗證的用戶訪問該組件。 使用 [Authorize] 屬性 以下代碼限制為僅允許經過身份驗證…

leetcode 493 翻轉對

一、題目描述 二、解題思路 本題的思路與逆序數的思路相似&#xff0c;采用歸并排序的思路來實現。leetcode LCR 170.交易逆序對的總數-CSDN博客 注意&#xff1a;但是逆序數的ret更新在左、右區間合并時更新&#xff0c;但本題ret更新在左、右區間合并前更新。 三、代碼實現…

初識微服務-nacos配置中心

配置中心 概述 配置中心是微服務中不可或缺的組件&#xff0c;因為如果沒有配置中心&#xff0c;那么各個微服務的的配置信息無法得到統一和管理&#xff0c;會變得冗余。 :::color4 配置中心是用于管理應用程序配置信息的工具 集中管理配置&#xff1a;解決微服務架構下配置分…

Android webview更新記錄-aosp

一、下載 webview下載地址&#xff0c;感謝火哥分享&#xff0c;版本很全。 https://www.firepx.com/app/android-system-webview/ 二、更新 external/chromium-webview/prebuilt 具體更新那個目錄&#xff0c;需要查看編譯架構 這個看你的lunch就行&#xff0c;這里我的是a…

無感FOC(無傳感器磁場定向控制)

我們來詳細解析無感FOC&#xff08;無傳感器磁場定向控制&#xff09;中的高頻方波注入&#xff08;High-Frequency Square-Wave Injection, HFSWI&#xff09;?? 的原理。這是一個用于零低速或極低速范圍內估算轉子位置的核心技術。核心思想與要解決的問題在電機靜止或轉速極…