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;​​ 的原理。这是一个用于零低速或极低速范围内估算转子位置的核心技术。核心思想与要解决的问题在电机静止或转速极…