1.2 Scala变量与数据类型
一、变量声明
(一)简单说明
Scala中变量的声明使用关键字val和var。val类似Java中的final变量,也就是常量,一旦初始化将不可修改;var类似Java中的非final变量,可以被多次赋值,多次修改。
val - value - 值
var - variable - 变量
(二)利用val声明变量
1、声明方式
val <变量名>[: 数据类型] = 变量值
定义变量比较灵活,可以指定数据类型,也可以不指定数据类型,由Scala根据赋的值自行判断数据类型
在声明变量上,Scala兼具Java和Python的特点。Java是静态语言,声明变量必须指定数据类型,Python是动态语言,声明变量不需要指定数据类型。
2、案例演示
声明一个val字符串变量name,其实定义的是一个常量
上述代码中的第二行为执行第一行的输出信息,从输出信息中可以看出,该变量类型由Scala自动推断为String。
当然也可以在声明变量时指定数据类型,与Java不同的是,数据类型需要放到变量名的后面,这使得面对复杂的数据类型时更易阅读。
由于val声明的变量是不可修改的,若对声明的变量name进行修改,则会报错
因此,如果希望变量可以被修改(can be mutated),就需要使用var声明。
(三)利用var声明变量
1、声明方式
var <变量名>[: 数据类型] = 变量值
2、案例演示
声明一个var字符串变量message,然后利用print函数输出其值
对var变量message重新赋值,再输出其值
(四)换行输入语句(续行)
如果需要换行输入语句,那么只需要在换行的地方按回车键,解析器会自动在下一行以竖线进行分割
如果要输入多行字符串,得使用三引号
去掉多行字符串的前导空格
用双引号是无法实现多行字符串
Scala跟Java一样,没有像Python那样用\作为续行符
(五)同时声明多个变量
Scala还可以将多个变量放在一起进行声明,将一个数值同时赋给多个变量
Scala不能一次对多个变量赋不同的值
注意:Java也可以将多个变量放在一起进行声明,但是各个变量是独立赋值的
注意:Python只能将可迭代的数据赋给多个变量
(六)总结变量的声明
1、变量必须初始化
定义变量需要初始化,否则会报错。
注意:Java里可以先声明变量,然后再赋值
2、定义变量可以不指定数据类型
定义变量时可以不指定数据类型,系统会根据初始化值自动推断变量的类型。
注意:Java声明变量必须指定类型
3、鼓励优先使用val(常量)
Scala中鼓励优先使用val(常量),除非确实需要对其进行修改,才使用var(变量)。
4、语句不需要写结束符
Scala语句不需要写结束符,除非同一行代码使用多条语句时才需要使用分号隔开。
二、数据类型
(一)Scala类型层次结构
在Scala中,所有的值都有一个类型,包括数值和函数。如下图所示,说明了Scala的类型层次结构
AnyVal - Any Value
AnyRef - Any Reference
1、Any类型
Any是Scala类层次结构的根,也被称为超类或顶级类。Scala执行环境中的每个类都直接或间接地从该类继承。该类中定义了一些通用的方法,例如equals()、hashCode()和toString()。Any有两个直接子类:AnyVal和AnyRef。
2、AnyVal类型
AnyVal表示值类型,有9种预定义的值类型,它们是非空的Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是一个不包含任何信息的值类型,和Java语言中的void等同,用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
3、AnyRef类型
AnyRef表示引用类型。所有非值类型都被定义为引用类型。Scala中的每个用户定义类型都是AnyRef的子类型。AnyRef对应于Java中的java.lang.Object。
4、案例演示
定义一个类型为List[Any]的变量list,list中包括字符串、整数、字符、布尔值和函数,由于这些元素都属于对象Any的实例,因此可以将它们添加到list中。
遍历列表元素,并显示其数据类型
获取列表前三个元素构成的子列表
将列表反序,原列表不变
(二)基本数据类型
1、基本类型表
序号 类型 说明 值
1 Byte 字节型 34
2 Short 短整型 127
3 Int 整型 43423
4 Long 长整型 3452342L
5 Char 字符型 ‘a’, ‘\n’
6 String 字符串 “Courage”
“”“I love
Scala
very much.”“”
7 Float 浮点型 34.67F
8 Double 双精度 34534.454, 45.34242D
9 Boolean 布尔型 true, false
2、简要说明
(1) String在java.lang包下,其余类型在scala包下,由于Scala会自动导入java.lang和scala包,因此这些类型可以在程序中直接使用。
(2)其实scala中并没有真正意义上的基本类型(如Java的基本类型),以上十种基本类型都是类。
(3)在Scala中,基本数据类型与其它类的区别在于,其对象都以直接量形式体现,直接量与Java中基本相同。
(4)String类型的"““用法:在String直接量中可以使用””“…”""的语法将一段内容直接包括起来,使其内容中可以包含任意字符而不需转义,此时可在每行前使用管道符|控制缩进格式,在字符串上调用stripMargin来使字符串在|处对齐。
直接输出三引号字符串
利用.stripMargin与管道符“|”来调整字符串输出格式
3、基本类型的富包装器
九个基本类型提供的方法比较有限,为了拓展其功能,Scala提供了对应九个富包装器,其实也是九个类,这九个类的直接量在需要时可以自动被转换为其对应的富包装类来调用富包装类提供的额外方法。
序号 类型 富包装器
1 Byte scala.runtime.RichByte
2 Short scala.runtime.RichShort
3 Int scala.runtime.RichInt
4 Long scala.runtime.RichLong
5 Char scala.runtime.RichChar
6 String scala.runtime.RichString
7 Float scala.runtime.RichFloat
8 Double scala.runtime.RichDouble
9 Boolean scala.runtime.RichBoolean
(三)数据类型转换
1、值类型的转换
Scala中的值类型可以按下图的方式转换,且转换是单向的
将Long值赋给Float类型变量,在这种情况下会丢失一些精度,因此会弹出一个警告,可以利用.toFloat方法解决这个问题
如果将Float类型转换成Long类型就会报错,不能自动从Float类型转换成Long类型,但是可以调用方法来实现
2、引用类型的转换
此外,Scala还可以将引用类型转换为其子类型。
Nothing是所有类型的子类,在Scala类层级的最低端。Nothing没有对象,因此没有具体值,但是可以用来定义一个空类型,类似于Java中的标示性接口(如Serializable,用来标识该类可以进行序列化)。举个例子,如果一个方法抛出异常,异常的返回值类型就是Nothing(虽然不会返回)。
Null是所有引用类型(AnyRef)的子类,所以Null可以赋值给所有的引用类型,但不能赋值给值类型,这个和Java的语义是相同的。Null有一个唯一的单例值null。
相关文章:
1.2 Scala变量与数据类型
一、变量声明 (一)简单说明 Scala中变量的声明使用关键字val和var。val类似Java中的final变量,也就是常量,一旦初始化将不可修改;var类似Java中的非final变量,可以被多次赋值,多次修改。 val - …...
深入探讨软件测试的质量度量指标
本文的目的是介绍项目中使用到主要质量指标,这些质量指标可以分为以下三类: 质量保证过程指标生产事故管理指标度量质量文化指标 质量保证过程指标 质量保证指标可以通过测试覆盖率来度量功能和非功能测试的覆盖率,同时也可以根据测试发现…...
6.12作业
1、pinia和vuex的区别 1.pinia没有mutations,只有state,getters,actions 2.pinia分模块不需要modules (之前vuex分模块需要modules) 3.pinia体积更小(性能更好) 4.pinia可以直接修改state数据 2、Vue2和vue3的响应式原理分别是什么&#x…...
RabbitMQ集群部署之镜像模式
RabbitMQ集群的普通模式中,一旦创建队列的主机宕机,队列就会不可用。不具备高可用能力。如果要解决这个问题,必须使用官方提供的镜像集群方案。 官方文档地址:https://www.rabbitmq.com/ha.html 1.镜像模式的特征 默认情况下&a…...
【算法】Remove Zero Sum Consecutive Nodes from Linked List 从链表中删去总和值为零的连续节点
文章目录 Remove Zero Sum Consecutive Nodes from Linked List 从链表中删去总和值为零的连续节点问题描述:分析代码 Remove Zero Sum Consecutive Nodes from Linked List 从链表中删去总和值为零的连续节点 问题描述: 给你一个链表的头节点 head&am…...
音悦台项目测试报告
文章目录 项目背景项目功能测试计划与设计功能测试自动化测试 测试结果功能测试结果UI自动化测试结果 项目背景 现如今人们的生活压力大,容易使人疲惫,为了使得人们在闲暇之余可以听音乐放松,为此设计出一款轻量的听音乐网站,快速…...
数据库存储过程和函数
MySQL存储过程和存储函数 MySQL中提供存储过程(procedure)与存储函数(function)机制,我们先将其统称为存储程序,一般的SQL语句需要先编译然后执行,存储程序是一组为了完成特定功能的SQL语句集&…...
Spring依赖注入有哪些?各有什么优缺点?
文章目录 前言概述一、属性注入1.1 实例1.2 优点1.3 缺点 二、Setter注入2.1 实例2.2 优点2.3 缺点 三、 构造方法注入3.1 实例3.2 优点3.3 缺点 四、扩展 前言 IoC和DI是Spring中重要的两个概念,其中IoC指的是控制反转,DI(依赖注入)指的是IoC的具体实现…...
java八股文-并发篇
并发篇 1. 线程状态 要求 掌握 Java 线程六种状态掌握 Java 线程状态转换能理解五种状态与六种状态两种说法的区别 六种状态及转换 分别是 新建 当一个线程对象被创建,但还未调用 start 方法时处于新建状态此时未与操作系统底层线程关联 可运行 调用了 start …...
Elasticsearch8.6.0安装
Elasticsearch 8.5.0 安装 Elasticsearch 简介Elasticsearch 8.6.0 安装创建网络拉取镜像运行镜像设置密码修改kibana配置绑定ES代码绑定:手动绑定: 配置ik分词器扩展词词典停用词词典 Elasticsearch 简介 Elasticsearch(ES) 是一…...
Vue - 第五天 动态组件 插槽 自定义指令
动态组件& 插槽& 自定义指令 一、动态组件1.什么是动态组件2.如何实现动态组件渲染3.使用 keep-alive 保持状态4. keep-alive 对应的生命周期函数5. keep-alive 的 include 属性6.动态展示左右组件7.例子 二、插槽1.什么是插槽2.体验插槽的基础用法2.1 没有预留插槽的内…...
如何开展web自动化测试
Web 自动化是指使用测试脚本在 Web 上自动执行任务。它包括填写表单、导航网页、单击链接或按钮以及从网站中提取数据等任务。 它可用于各种目的,例如自动输入数据或测试网站的功能。有几种工具和编程语言可用于自动化网络上的任务,包括Selenium&#x…...
【博学谷学习记录】超强总结,用心分享 | 架构师 Maven学习总结
文章目录 Maven基本1.什么是Maven2.为什么用Maven?(1)jar 包的规模(2) jar 包的来源(3)jar 包之间的依赖关系 3.Maven目录结构4.maven仓库配置 Pom层次Pom文件简介Super POM 依赖管理1 依赖传递2 传递性依…...
PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来
简介 这是我们学PPT处于初级到中级进化阶段常做的一件事,就是拿了这种纯文字类版面来做布局。而且这种文字都是政企类的、相当苦涩难懂、无法创意。 因此我们会要求使用7种排版来优化这个版面。这和达芳奇画鸡蛋很像,这样的练习需要坚持一段时间,就是拿了纯文字来beautifu…...
Whistle(基于 Node 实现的跨平台抓包调试工具)的使用
Whistle(基于 Node 实现的跨平台抓包调试工具)的使用 基于Node实现的跨平台抓包调试工具 可以劫持网络请求,并进行请求和响应的修改,来提高我们的开发调试效率 1.一键安装(装包/证书) npm i -g whistle && w2 start --init 证书的问题 安装…...
数学模型:Python实现非线性规划
上篇文章:整数规划 文章摘要:非线性规划的Python实现。 参考书籍:数学建模算法与应用(第3版)司守奎 孙玺菁。 PS:只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现:可以参考1.最优化模型与算法——基于…...
Docker网路模型(四)使用 bridge 网络
使用 bridge 网络 在计算机网络中,一个 bridge(网桥)是一个链路层设备,负责在不同的网段之间转发信息。 bridge 可以是真实的硬件设备也可以是由宿主机底层提供的软件模拟设备。 在 Docker 中,bridge 网络使用了软件…...
数据结构与算法之美 | 排序(2)
归并排序(Merge Sort) 基本思想: 如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 def merge_sort…...
【外企面试系列】必备口语短语与例句 - A系列
a big headache令人头痛的事情 I have a big headache from all the noise. (我因为噪音而头痛。)The paperwork is a big headache for me. (对我来说,文书工作是件头痛的事情。) a fraction of 一部分 She ate only a fraction of her meal. (她只吃了一部分饭…...
Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例
Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例 一、Opencv大图找小图说明二、Opencv的window安装1.下载windows下的安装包2.安装3.Java中Opencv加载测试 三、Java中通过Opencv进行模板匹配大图找小图四、进行多图查找五:案例下载bilibili视…...
芯片设计复杂度量化:从经验估算到行业标准工时的工程实践
1. 芯片设计复杂度:从模糊感知到精确量化的工程革命在半导体行业摸爬滚打了十几年,我见过太多项目因为初期对“工作量”的误判而陷入泥潭。市场部拿着一个充满诱惑的规格书,研发总监拍着胸脯说“没问题,半年搞定”,结果…...
WinForm弹窗进阶:手把手教你封装一个通用的MessageBoxHelper工具类(.NET Framework/C#)
WinForm弹窗进阶:打造高复用性的MessageBoxHelper工具类 在WinForm开发中,MessageBox.Show()就像空气一样无处不在——从简单的操作确认到复杂的错误处理,这个基础组件承担了太多交互职责。但当你第20次写下MessageBox.Show("操作成功&q…...
别只盯着YOLOv5了!从R-CNN到DETR:手把手带你看懂目标检测算法演进史(附论文精读笔记)
从R-CNN到DETR:目标检测算法的范式革命与技术演进 当计算机视觉领域的研究者翻开2023年的顶会论文时,会发现目标检测任务已经呈现出与五年前截然不同的技术图景。这个看似"古老"的计算机视觉基础任务,正在经历着从传统卷积到Transf…...
收藏!小白程序员快速入行Agent开发:低门槛高薪风口已开启!
本文详细介绍了Agent开发领域的入门要求,强调Python工程能力、LLM API调用、RAG技术、Function Calling原理等核心技能。文章指出,虽然Agent开发对学历要求不高,但需掌握扎实的技术栈和具备实战项目经验,建议小白抓住当前低门槛窗…...
为个人AI助手项目集成多模型API实现成本与性能平衡
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为个人AI助手项目集成多模型API实现成本与性能平衡 构建个人AI助手是许多独立开发者热衷的项目。在开发过程中,一个常见…...
Ubuntu 18.04下ISE 14.7与Vivado 2018.2的避坑安装与深度配置指南
1. 环境准备与依赖安装 在Ubuntu 18.04上安装ISE 14.7和Vivado 2018.2之前,系统环境配置是决定成败的关键。我遇到过不少开发者因为跳过这个步骤,导致后续安装过程频繁报错。这里分享几个必须检查的要点: 首先确认系统架构,虽然…...
Sonic搜索集群终极指南:从单机到高可用的完整部署方案
Sonic搜索集群终极指南:从单机到高可用的完整部署方案 【免费下载链接】sonic 🦔 Fast, lightweight & schema-less search backend. An alternative to Elasticsearch that runs on a few MBs of RAM. 项目地址: https://gitcode.com/gh_mirrors/…...
从手机5G到智能声呐:LMS自适应波束形成算法在真实场景里是怎么用的?
从手机5G到智能声呐:LMS自适应波束形成算法的工程实践 当你在嘈杂的会议室里对着智能音箱说话时,它为何能精准捕捉你的声音而忽略背景噪音?当5G基站需要同时服务数百个移动设备时,又是如何避免信号相互干扰?这些看似毫…...
LT8650S双通道同步降压稳压器设计与汽车电子应用
1. LT8650S双通道同步降压稳压器设计解析在汽车电子和工业设备领域,电源管理系统的设计往往面临严苛挑战。LT8650S作为一款42V输入、双通道4A输出的同步降压稳压器,其Silent Switcher 2架构和6.2μA超低静态电流特性,为工程师提供了高性价比的…...
争分夺秒与步步为营:Infoseek舆情系统如何重构危机响应的时间哲学
“黄金4小时”甚至“黄金1小时”,是公关行业奉行的铁律。然而,为了追求速度而仓促发出的声明,常常因为事实核查不清、逻辑存在漏洞或情感表达不当,引发更猛烈的“二次翻车”。这种“翻车”对企业公信力的伤害,往往比原…...
