详解 Scala 的变量、标识符、数据类型
一、注释
Scala 注释与 Java 一致
// 单行注释/** 多行注释*//*** 文档注释*/
二、变量与常量
1. 语法
// 变量,类型可以省略
var varName:varClass = value
// 常量,类型可以省略
val valName:valClass = value
2. 案例
// 使用 var/val 才会在类中声明属性,否则只是参数
class Student(name:String, var age:Int) { def printInfo():Unit = {println(name + "," + age + "," + Student.school)}
}object TestVariable {def main(args: Array[String]): Unit = {// 定义变量和常量的通用语法var a: Int = 10val b: String = "James"// 声明变量时,类型可以省略,编译器自动推导,即类型推导var a1 = 10// 变量类型确定后,就不能修改,Scala 是强数据类型语言var a2 = 20// a2 = "Bob" // 报错// 变量声明时,必须要有初始值// var a3: Int // 报错// var 修饰的变量可改变,val 修饰的变量不可改val b1 = 30// b1 = 25 // 报错// var 修饰的对象引用可以改变,val 修饰的对象不可改变,但对象的属性可以改变var tom = new Student("Tom", 20)tom = new Student("tom", 18)val rose = new Student("rose", 16)// rose = new Student("Rose", 18) // 报错rose.age = 18// rose.name = "Rose" // 报错}
}
三、标识符
Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符
1. 规则
-
第一类:以字母或者下划线开头,后接字母、数字、下划线
-
第二类:以操作符开头,且只包含操作符(+ - * / # !等)
-
第三类:用反引号 `` 包括的任意字符串,即使是 Scala 关键字(39 个)也可以
package, import, class, object, trait, extends, with, type, for private, protected, abstract, sealed, final, implicit, lazy, override try, catch, finally, throw if, else, match, case, do, while, for, return, yield def, val, var this, super new true, false, null
2. 案例
object TestIdentifier {def main(args: Array[String]): Unit = {// 以字母或者下划线开头,后接字母、数字、下划线var hello = "hello"var hello123 = "hello123"var _hello = "_hello"// var h-b = 10 // 报错// var 123abc = 20 // 报错// 以操作符开头,且只包含操作符(+ - * / # !等)var -+/% = 30println(-+/%)// var -a+4/b = 30 // 报错// 用反引号 `` 包括的任意字符串var `class` = "class"println(`class`)// var class = "class" // 报错}
}
四、字符串输出
object TestString {def main(args: Array[String]): Unit = {// 字符串通过 + 或 * 号拼接var name = "James"var age = 37println(age + "岁的" + name + "还在征战 NBA")println(name * 4) //字符串复制拼接// printf 将字符串格式输出,通过 % 占位传值printf("%d岁的%s还在征战 NBA", age, name)println()// 字符串模板(插值字符串):通过 $ 获取变量值// s"${var}"println(s"${age}岁的${name}还在征战 NBA")// f"${var}%":格式化模板字符串var num = 2.3456 // 默认 Double 类型println(f"The number is ${num}%2.2f") // The number is 2.35,保留两位小数// raw"${}":保留原始格式输出println(raw"The number is ${num}%2.2f") // The number is 2.3456%2.2f// 三引号模板字符串:保持多行字符串的原格式输出,s""" """val sql = s"""|select| name,| age|from student |where name = ${name}|and age > ${age}""".stripMarginprintln(sql)}
}
五、控制台输入
1. 语法
// 使用 scala.io 包下的 StdIn 类的方法
StdIn.readLine()
StdIn.readInt()
2. 案例
import scala.io.StdInobject TestStdIn {def main(args: Array[String]): Unit = {println("请输入姓名:")val name = StdIn.readLine()println("请输入年龄:")val age = StdIn.readInt()println(s"欢迎${age}岁的${name}")}
}
六、读写文件
import scala.io.Sourceobject TestStdIn {def main(args: Array[String]): Unit = {// 读取文件数据Source.fromFile("src/main/resources/test.txt").foreach(print)// 写入数据到文件,使用 Java 的类库val writer = new PrintWriter(new File("src/main/resources/output.txt"))writer.write("hello scala from java writer")writer.close()}
}
七、数据类型
- Scala 中一切数据都是对象,都是 Any 的子类
- Scala 中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象
- Scala 数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换)
- Scala 中的 StringOps 是对 Java 中 String 的增强
- Unit:对应 Java 中的 void,用于方法返回值的位置,表示方法没有返回值。Unit是一个数据类型,只有一个对象就是()。void 不是数据类型,只是一个关键字
- Null是一个类型,只有一个对象就是 null。它是所有引用类型(AnyRef)的子类
- Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,这样可以把抛出的返回值,返回给任何的变量或者函数
1.整数类型
-
分类:
类型 描述 Byte[1] 8 位有符号补码整数。数值区间为 -128 到 127 Short[2] 16 位有符号补码整数。数值区间为 -32768 到 32767 Int[4] 32 位有符号补码整数。数值区间为 -2147483648 到 2147483647 Long[8] 64 位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 = 2 的(64-1)次方-1 -
案例:
object TestDataType {def main(args: Array[String]): Unit = {// 正确var n1: Byte = 127var n2: Byte = -128// 错误// var n3:Byte = 128// var n4:Byte = -129// 整数默认为 Intval a1 = 10// 数值范围超过 Int,则需要声明为 Long 型且必须后加 l 或 L(建议)val a2: Long = 9223372036854775807L// 不同类型计算val a3: Byte = (10 + 20) // IDEA报错,但可以正确运行val a4: Byte = 10// val a5: Byte = (a4 + 20) // 运行报错val a6: Byte = (a4 + 20).toByte} }
2. 浮点类型
-
分类:
类型 描述 Float[4] 32 位, IEEE 754 标准的单精度浮点数 Double[8] 64 位 IEEE 754 标准的双精度浮点数 -
案例:
object TestDataType {def main(args: Array[String]): Unit = {// 浮点数默认为 Doubleval d1 = 3.1415// 声明 Float 型常量,须后加 f 或 Fvar f1: Float = 2.2345678912f// var f2: Float = 2.2345678912 //报错} }
3. 字符类型
-
说明:字符类型 Char 表示单个字符
-
案例:
object TestDataType {def main(args: Array[String]): Unit = {// 字符常量是用单引号 '' 括起来的单个字符val c1: Char = 'a'val c2 = '9'// 控制字符val c3 = '\t' // 制表符val c4 = '\n' // 换行符// 转义字符val c5 = '\\' // 表示 \val c5 = '\""' // 表示 ""// 字符类型底层保存的 ASCII 码值val i1: Int = c1 // 97val i2: Int = c2 // 57} }
4. 布尔类型
-
说明:
- 布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false
- Boolean 类型占 1 个字节
-
案例:
object TestDataType {def main(args: Array[String]): Unit = {var isResult : Boolean = falsevar isResult2 : Boolean = true} }
5. Unit/Null/Nothing 类型
-
说明
类型 说明 Unit 表示无值,和 Java 语言中 void 等同。用作不返回任何结果的方法的结果类型。Unit 只有一个实例值,写成 () Null null , Null 类型只有一个实例值 null Nothing Nothing 类型在 Scala 的类层级最低端;它是任何其他类型的子类型。当一个函数,我们确定没有正常的返回值,可以用 Nothing 来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性) -
案例
object TestDataType {def main(args: Array[String]): Unit = {// 1.空值 Unitdef m1(): Unit = {println("m1 被调用")}val a: Unit = m1()println("a:" + a) // a:()// 2.空引用 Null// val b: Int = null // 报错var stu: Student = new Student("tom", 18)stu = nullprintln("stu:" + stu) // stu:null// 3.Nothingdef m2(n: Int): Nothing = {throw new NullPointerException}} }
八、类型转换
1. 自动类型转换
- 自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算
- 把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换
- (Byte, Short) 和 Char 之间不会相互自动转换
- Byte,Short,Char 三者可以计算,在计算时首先转换为 Int 类型
- 虽然 Byte 可以自动提升为 Short 精度,但是二者在运算时必须提升为 Int
object TestValueTransfer {def main(args: Array[String]): Unit = {//(1)自动提升原则var n = 1 + 2.0println(n) // n 类型是 Double//(2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换var n2 : Double= 1.0//var n3 : Int = n2 //错误,原因不能把高精度的数据直接赋值和低精度//(3)(byte,short)和 char 之间不会相互自动转换var n4 : Byte = 1//var c1 : Char = n4 //错误var n5: Int = n4//(4)byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型var n6: Byte = 1var n7: Short = 2var c2: Char = 1// var n : Short = n6 + c2 + n7 // n6 + c2 结果类型是 int// var n8 : Short = n6 + n7 // 错误}
}
2. 强制类型转换
- 将数据由高精度转换为低精度,就需要使用到强制转换,但存在精度损失或数据溢出
- 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
object TestDataTypeConversion {def main(args: Array[String]): Unit = {val a: Int = 10// val a1: Byte = a // 报错val a1: Byte = a.toByte // 调用转换方法:toShort/toInt/toLong.....}
}object TestType {def main(agrs: Array[String]): Unit = {// 强制类型转换数据溢出val n: Int = 130val b: Byte = n.toByteprintln("b:" + b) // -126/*解析:8421码Int 类型的 130 在底层的存储(4 字节,32 位):原码:0000 0000 0000 0000 0000 0000 1000 0010反码:0000 0000 0000 0000 0000 0000 1000 0010补码:0000 0000 0000 0000 0000 0000 1000 0010Int转Byte:1 字节,8 位补码:1000 0010反码:1000 0001原码:1111 1110-126*/}
}
3. 数值与String转换
object TestNumAndStringConversion {def main(agrs: Array[String]): Unit = {// 1.数值转Stringval a: Int = 3val str: String = a + ""// 2.String转数值var s1 : String = "12"var s2 : String = "12.3"var n1 : Byte = s1.toBytevar n2 : Short = s1.toShortvar n3 : Int = s1.toIntvar n4 : Long = s1.toLong// var n5: Int = s2.toInt // 运行抛 NumberFormatException// var nn5: Int = "hello".toInt // 报错var n6: Double = s2.toDouble}
}
相关文章:

详解 Scala 的变量、标识符、数据类型
一、注释 Scala 注释与 Java 一致 // 单行注释/** 多行注释*//*** 文档注释*/二、变量与常量 1. 语法 // 变量,类型可以省略 var varName:varClass value // 常量,类型可以省略 val valName:valClass value2. 案例 // 使用 var/val 才会在类中声明属…...
JVM-调优之-高内存占用问题排查
排查思路 1)检查jvm内存的分配情况 2)检查jvm的gc情况 3) 找出占用量比较大的对象 第一步:jmap -heap PID 查看jvm内存使用情况 jmap -heap 2525 可以看到老年代年轻代等其他内存区域内存使用率百分比 第二步:jsta…...

全球排名第一的免费开源ERP:Odoo与微信集成的应用场景解析
概述 本文介绍了世界排名第一的开源免费企业应用软件Odoo ERP和企业微信、个人微信的各种对接功能。包括微信登录的对接、微信公众号的对接、微信消息的对接、微信支付的对接、微信打卡的对接、微信小程序的对接。 微信登录的对接 Odoo的登录,除了标准的用户名/密码…...
C++中的两类智能指针std::unique_ptr与std::shared_ptr
在C中,std::unique_ptr和std::shared_ptr是两种智能指针,用于管理动态分配的内存资源,避免内存泄漏和提高代码的安全性。它们之间有一些重要的区别,下面对它们进行简要比较: std::unique_ptr: 独占所有权:…...
java中Future使用详细介绍
一、什么是Future? 在并发编程中,可以通过Future对象来异步获取结果。 使用Thread或runnable接口都不能获取异步的执行结果,因为他们没有返回值。而通过实现Callable接口和Future就可以获取异步执行的结果,当异步执行结束后&…...

docker和containerd的区别
docker和containerd的区别 1、容器运行时 1.1 容器运行时概念 容器运行时(Container Runtime)是一种负责在操作系统层面创建和管理容器的软件工具或组件。它是容器化技术的核心组件之一,用于在容器内部运行应用程序,并提供隔离…...
汇编实现流水灯
1.使能时钟: 1使能GPIO的外设时钟ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x3<<4)//使能第4,5位str r1,[r0] 2.设置为输出模式 设置GPIOE10为输出模式ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1…...
SQL生成序列浅析
01.sqlserver版本 使用sqlserver将数据复制n条 selectt.indx,t.name,tmp.vlue from (values(1,苹果) ) as t(indx, name) ,(select[number] as vluefrom master.dbo.spt_valueswhere [type] pand [number] between 1 and 10 ) as tmpspt_values是什么 spt_values是SQL Se…...

24年gdcpc省赛C题
1279:DFS 序 先不考虑多节点,先看着颗二叉树,假设他们的父亲节点是第k个被访问的点,如果先访问左子树,那么得到的结果是a1*ka2*(k1)b1*(2k)b2*(2k1),可以发现,先访问左子树,那么右子树每次的乘以的p值实际上是左子树乘以的p值加上左子树的节点个数,比如a1*k和b1*(2k),如果不看2…...

以梦为马,不负韶华(3)-AGI在企业服务的应用
AGI在企业服务中,各应⽤已覆盖企业全流程,包含⼈⼒、法务、财税、流程⾃动化、知识管理和软件开发各领域。 由于⼤语⾔模型对⽂本处理类场景有着天然且直接的适配性,⽂本总结、⽂本内容⽣成、服务指引等发展起步早且应⽤成熟度更⾼。 在数据…...
Xshell 使用
Xshell 使用 ①xshell 安装包 ②xshell 卸载 ③xshell 同时控制多窗口 ①xshell 安装包 Xshell 7 破解版 ②xshell 卸载 第一步: 打开控制面板卸载xshell 第二步: win+R,输入regedit,打开注册表,删除xshell相关注册信息 注册表目录: 在下面两个目录中查找xshell相关…...
【yijiej】mysql报错 之 报错:Duplicate entry 字段 for key ‘表名.idx_字段’
一、问题操作 Mysql 进行insert 操作,报错:Duplicate entry 字段 for key ‘表名.idx_字段’ 原因解析:idx 是做的索引键,是具有唯一性二、问题原因(三种情况,当前我遇到的情况是第一种) 1、当 …...

解决npm卡死,无法安装依赖
npm卡死,无法安装依赖 异常描述原因分析与解决方法 异常描述 1.无法进入命令行,或是很慢没反应 2.装表格无限滚动的el-table-infinite-scroll依赖一上午了,也不能装,报错提示 原因分析与解决方法 1.命令行的问题:缓…...

速卖通测评揭秘:如何选择安全的渠道操作
许多商家对测评存在误解,认为只需进行几次测评就能迅速打造爆款。实际上,测评是一个需要计划和持久性的过程,以便让平台检测到产品的受众程度并提高产品的曝光和权重。 在进行测评时,安全是首要考虑的问题。平台可以通过设备、网…...
ping不通ip的解决方法
解决ping不通IP的问题可以通过以下几种方法: 1.检查IP配置:确保所有设备的IP地址、子网掩码和默认网关配置正确。如果使用DHCP,请确认设备已设置为自动获取IP地址,并检查DHCP服务器的地址池配置是否正确且未耗尽。 2.检查网络设…...

Linux x86_64 UEFI 启动
文章目录 前言一、UEFI二、Disk device compatibility2.1 GPT 磁盘分区表2.1.1 简介2.1.2 Linux 2.2 ESP(EFI) 文件系统2.2.1 简介2.2.2 LinuxLinux Kernel EFI Boot Stub 三、UEFI GPT grub23.1 简介3.2 引导方式 3.3 BOOTX64.EFI3.4 shimx64.efi3.5 …...
妙解设计模式之适配器模式
目录 适配器模式的概念生活中的例子在编程中的例子 软件工程中的实际应用兼容旧接口整合第三方库简化复杂接口跨平台支持 总结 适配器模式的概念 适配器模式是一种结构设计模式,它允许将接口不兼容的类通过一个适配器类进行适配,使得这些类可以一起工作…...

【Linux】Linux下centos更换国内yum源
🌱博客主页:青竹雾色间 🌱系列专栏:Linux 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 1. 备份旧的 YUM 源文件2. 下载国内的 YUM 源文件阿里云:网易: 3. 清理 YUM 缓存4. 更新…...

HTML静态网页成品作业(HTML+CSS)——动漫熊出没介绍网页(3个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有3个页面。 二、作品演示 三、代…...
算法训练营day42
dp含义确定 递推公式 初始化 遍历顺序 打印 题目1:62. 不同路径 - 力扣(LeetCode) class Solution { public:int uniquePaths(int m, int n) {// 定义dp数组 含义是每个坐标到达的路径vector<vector<int>> dp(m, vector&l…...

LangChain4j 学习教程项目
LangChain4j 学习教程 项目地址项目简介主要功能使用的技术和库项目环境配置环境要求 依赖版本每天学习内容和目标Day 01Day 02Day 03Day 04Day 05Day 06Day 07Day 08Day 09Day 10Day 11Day 12重点学习内容 RAG 经过为期12天(日均1小时)的LangChain4j源码…...
使用docker 安装Redis 带配置文件(x86和arm)版本
一、安装redis 1.1 拉去ARM镜像(7.4.2) docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_redis:latest1.2 拉去x86镜像(8.0.1)版本 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest新建文件夹 mkd…...

C++11 Move Constructors and Move Assignment Operators 从入门到精通
文章目录 一、引言二、基本概念2.1 右值引用(Rvalue References)2.2 移动语义(Move Semantics) 三、移动构造函数(Move Constructors)3.1 定义和语法3.2 示例代码3.3 使用场景 四、移动赋值运算符ÿ…...

1、Go语言基础中的基础
摘要:马士兵教育的Go语言基础的视频笔记。 第一章:走进Golang 1.1、Go的SDK介绍 1.2、Go的项目基本目录结构 1.3、HelloWorld 1.4、编译 1.5、执行 1.6、一步到位 1.7、执行流程分析 1.8、语法注意事项 (1)源文件以"go&qu…...

Web 3D协作平台开发案例:构建制造业远程设计与可视化协作
HOOPS Communicator为开发者提供了丰富的定制化能力,助力他们在实现强大 Web 3D 可视化功能的同时,灵活构建符合特定业务需求的工程应用。对于希望构建在线协同设计工具的企业而言,如何在保障性能与用户体验的前提下实现高效开发,…...
Apache DolphinScheduler 和 Apache Airflow 对比
Apache DolphinScheduler 和 Apache Airflow 都是开源的工作流调度平台,用于管理和编排复杂的数据处理任务和管道。以下是对两者在功能、架构、使用场景等方面的对比,用中文清晰说明: 1. 概述 Apache DolphinScheduler: 一个分布…...

基于LLaMA-Factory和Easy Dataset的Qwen3微调实战:从数据准备到LoRA微调推理评估的全流程指南
随着开源大模型如 LLaMA、Qwen 和 Baichuan 的广泛应用,其基于通用数据的训练方式在特定下游任务和垂直领域中的表现仍存在提升空间,因此衍生出针对具体场景的微调训练需求。这些训练涵盖预训练(PT)、指令微调(SFT&…...

vue2中使用jspdf插件实现页面自定义块pdf下载
pdf下载 实现pdf下载的环境安装jspdf插件在项目中使用 实现pdf下载的环境 项目需求案例背景,点击【pdf下载】按钮,弹出pdf下载弹窗,显示需要下载四个模块的下载进度,下载完成后,关闭弹窗即可! 项目使用的是…...

自动化提示生成框架(AutoPrompt)
自动化提示生成框架(AutoPrompt) 一、核心创新点 自动化提示生成框架(AutoPrompt) 创新本质:提出基于梯度引导搜索的自动化提示生成方法,替代人工设计模板的传统模式。技术路径: 将提示视为可训练的离散token序列,通过优化提示向量(prompt embedding)搜索语义空间。利…...
逻辑回归与Softmax
Softmax函数是一种将一个含任意实数的K维向量转化为另一个K维向量的函数,这个输出向量的每个元素都在(0, 1)区间内,并且所有元素之和等于1。 因此,它可以被看作是某种概率分布,常用于多分类问题中作为输出层的激活函数。这里我们以拓展逻辑回归解决多分类的角度对Softmax函…...