02-Scala变量与数据类型

news2024/12/24 2:22:08

注释

Scala注释使用和Java完全一样。注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。

  • 单行注释
  • 多行注释
  • 文档注释

变量与常量

常量:在程序执行的过程中,其值不会被改变的变量

Java中变量与常量的语法

  • 变量类型 变量名称 = 初始值 int a = 10
  • final 常量类型 常量名称 = 初始值 final int b = 20

Scala中变量与常量的语法

  • var 变量名 [: 变量类型] = 初始值 var i: Int = 10
  • val 常量名 [: 常量类型] = 初始值 val j: Int = 20

注意:

能用常量的地方尽量不用变量

(1)声明变量时,类型可以忽略,编译器自动推导,即类型推到

(2)类型确定后,就不能修改,说明Scala是强类型语言

(3)变量声明时,必须要有初始值

(4)在声明/定义一个变量时,可以使用 var 或 val 来修饰,var修饰的变量可改变val修饰的变量不可改变

package com.clear.chapter02

object Test01_Variable {
  def main(args: Array[String]): Unit = {
    // 声明变量的通用语法
    var a: Int = 10

    //(1)声明变量时,类型可以忽略,编译器自动推导,即类型推到
    var a1 = 10
    val b1 = 20

    //(2)类型确定后,就不能修改,说明 Scala是强类型语言
    var a2 = 15
    // a2 = "hello" 非法,常量不能修改

    //(3)变量声明时,必须要有初始值
    // var a3: Int  非法

    //(4)在声明/定义一个变量时,可以使用 var 或 val 来修饰,var修饰的变量可改变,val修饰的变量不可改变。
    a1 = 12
    // b1 = 21 非法,常量不可改变
  }
}

标识符的命令规范

Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符。

命名规则

​ Scala在的标识符声明,基本和Java是一致的,但是细节上会有所变化,有以下三种规则

​ (1)以字母或者下划线开头,后接字母、数字、下划线

​ (2)以操作符开头,且只包含操作符(+ - * / # $ 等)

​ (3)用反引号 `…`包括的任意字符串,即使是Scala关键字(39个)也可以

  • ​ package、import、class、objecttrait、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
package com.clear.chapter02

object Test03_Identifier {
  def main(args: Array[String]): Unit = {
    // (1)以字母或者下划线开头,后接字母、数字、下划线
    val hello: String = ""
    val _hello: String = ""
    // val 123hello: String = "" 非法,不能以数字开头
    // val h-b = "" 非法

    //(2)以操作符开头,且只包含操作符(+ - * / # $ 等)
    val +-*# = ""
    // val +s3 = "" 非法

    //(3)用反引号 `...`包括的任意字符串,即使是Scala关键字(39个)也可以
    // val try: String = "" 非法
    var `try`: String = ""
  }
}

字符串

​ 在 Scala 中,字符串的类型实际上就是 Java中的 String类,它本身是没有 String 类的。

​ 在 Scala 中,String 是一个不可变的字符串对象,所以该对象不可被修改。这就意味着你如果修改字符串就会产生一个新的字符串对象。

object ScalaString {
    def main(args: Array[String]): Unit = {
        val name : String = "scala"
        val subname : String = name.substring(0,2)
    }
}

字符串输出

基本语法

(1)字符串,通过+号连接

(2)printf 用法:字符串通过 % 传值

(3)字符串模板(插值字符串):通过 $ 获取变量值

字符串连接

传值字符串

插值字符串

多行字符串

package com.clear.chapter02

object Test04_String {
  def main(args: Array[String]): Unit = {
    // (1)字符串:通过 + 连接
    val name: String = "alice"
    val age: Int = 18
    println(name + age)
    // * 用于将一个字符串复制多次并拼接(与python用法一致)
    println(name * 3)

    // (2)printf用法:字符串,通过 % 传值
    printf(s"%d岁的%s好美", age, name)
    println()

    // (3)字符串模板(插值字符串):通过 $ 获取变量的值
    println(s"${age}岁的${name}好美")

    val num: Double = 2.3456
    println(f"The num is ${num}%2.2f") // 格式化模板字符串
    println(raw"The num is ${num}%2.2f") // 将字符串原样输出

    // (4)多行字符串:用三引号表示,保持多行字符串原格式输出
    val sql =
      s"""
         |select *
         |from
         |  student
         |where
         |  name = ${name}
         |and
         |  age > ${age}
         |""".stripMargin
    println(sql)
  }
}

结果

alice18
alicealicealice
18岁的alice好美
18岁的alice好美
The num is 2.35
The num is 2.3456%2.2f

select *
from
  student
where
  name = alice
and
  age > 18

输入输出

输入

基本用法

​ StdIn.readLine()、StdIn.readShort()、StdIn.readDouble()

从屏幕(控制台)中获取输入

object ScalaIn {
    def main(args: Array[String]): Unit = {
        // 标准化屏幕输入
        val age : Int = scala.io.StdIn.readInt()
        println(age)
}
}

从文件中获取输入

object ScalaIn {
    def main(args: Array[String]): Unit = {
        // 请注意文件路径的位置
            scala.io.Source.fromFile("input/user.json").foreach(
                line => {
                    print(line)
                }
            )
    scala.io.Source.fromFile("input/user.json").getLines()
    }
}

输出

Scala进行文件写操作,用的都是 java中的I/O类

import java.io.{File, PrintWriter}
import scala.io.Source

object ScalaOut {
    def main(args: Array[String]): Unit = {
      val writer = new PrintWriter(new File("output/test.txt" ))
      writer.write("Hello Scala")
      writer.close()
	}
}

网络

Scala进行网络数据交互时,采用的也依然是 java中的I/O类

object TestServer {
    def main(args: Array[String]): Unit = {
        val server = new ServerSocket(9999)
        while ( true ) {
            val socket: Socket = server.accept()
            val reader = new BufferedReader(
                new InputStreamReader(
                    socket.getInputStream,
                    "UTF-8"
                )
            )
            var s : String = ""
            var flg = true
            while ( flg  ) {
                s = reader.readLine()
                if ( s != null ) {
                    println(s)
                } else {
                    flg = false
                }
            }
        }
    }
}

...

object TestClient {
    def main(args: Array[String]): Unit = {
        val client = new Socket("localhost", 9999)
        val out = new PrintWriter(
            new OutputStreamWriter(
                client.getOutputStream,
                "UTF-8"
            )
        )
        out.print("hello Scala")
        out.flush()
        out.close()
        client.close()
    }
}

数据类型

Scala与Java有着相同的数据类型,但是又有不一样的地方

Java数据类型

Java的数据类型包含基本类型和引用类型

  • 基本类型:byte, short, char, int, long, float, double, boolean
  • 引用类型:Object,数组,字符串,包装类,集合,POJO对象等

​ 由于Java有基本类型,而且基本类型不是真正一样上的对象,即使后面产生了基本类型的包装类,但是仍然存在基本数据类型,所以Java语言并不是真正意思上的面向对象

Java基本类型的包装类:Byte、Character、Short、Integer、Long、Float、Double、Boolean

注意:

​ Java中基本类型和引用类型没有共同的祖先

Scala数据类型

Scala是完全面向对象的语言,所以不存在基本数据类型的概念,有的只是任意值对象类型(AnyVal)和任意引用对象类型(AnyRef)

1)Scala中一切数据都是对象,都是Any的子类。

2)Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象

3)Scala数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换)

4)Scala中的 StringOps 是对Java中 String 的增强

5)Unit:对应Java中的void,用于方法返回值的位置,表示方法没有返回值。Unit是一个数值类型,只有一个对象就是**()**。Void不是数据类型,只是一个关键字

6)Null是一个类型,只有一个对象就是null。它是所有引用类型(AnyRef)的子类。

7)Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,因为这样我们可以把抛出的返回值,返回给任何的变量或者函数。

在这里插入图片描述

整数类型(Byte、Short、Int、Long)

Scala的整数类型就是存放整数值的,比如 13、30、2456等

数据类型描述
Byte [1]8位有符合补码整数。数值区间为 -128 到 127
Short [2]16位有符合补码整数。数值区间为 -32768 到 32767
Int [4]32位有符合补码整数。数值区间为 -2147483648 到 2147483647
Long [8]64位有符合补码整数。数值区间为 -9223372036854775808 到 9223372036854775807即2的(63-1)的次方 -1

字符类型(Char)

基本说明

​ 字符类型可以表示单个字符,字符类型是Char

​ 字符常量是用单引号 ‘’ 括起来的单个字符

val c1: Char = 'a'
val c2: Char = '9'
val c3: Char = '\t'  // 制表符

// 字符变量底层保存ASCII码

布尔类型(Boolean)

val isTrue: Boolean = true

Unit类型、Null类型、Nothing类型

数据类型描述
Unit表示无值,和其他语言中的 void 等同。用作不放会任何结果的方法的结果类型。Unit只有一个实例值,写成 ()
Nullnull,Null类型只有一个实例值 null
NothingNothing类型是Scala的类层级最低端;它是任何其他类型的子类型。当一个函数,我们确定没有正常的返回值,可以用Nothing 来知道返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其他的函数或者变量(兼容性)
// 空类型
// 空值Unit
def m1(): Unit = {
    println("m1被调用")
}

val a = m1()
println(a)  // ()

// 空引用
val n: Int = null // 会报错
var student = new Student("alice"20)
studnet = null

// Nothing
def m2(n: Int): Nothing = {		// 该方法不会正常返回
    throw new NullPointerExceotion
} 

def m3(n: Int): Int = {	
    if (n == 0)
    	throw new NullPointerExceotion
    else
    	return n
} 

类型转换

基本说明

(1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有的数据转换成精度最大的那种数据类型,然后再进行计算

val a1: Byte = 10
val b1: Long = 234
val result1: Long = a1 + b1
val result2: Int = a1 + b1.toInt

(2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换

val a1: Byte = 10
val b1: Int = a1  // 低转高,自动类型转换
val c1: Byte = b1  // 报错

(3)(byte、short)和 char 之间不会相互自动转换

val a1: Byte = 10
val b1: Char = a1  // 报错
val c1: Byte = b1  // 报错
val c2: Byte = b1.toByte

(4)byte、short、char它们三者可以计算,在计算时首先转为为int类型

val a1: Byte = 10
val b1: Short = 20
val c1: Char = 'c'

val result1: Short = a1 + b1  // 报错
val result2: Int = a1 + b1 
val result3: Int = a1 + b1 + c1  

自动类型转化(隐式转换)

object ScalaDataType {
    def main(args: Array[String]): Unit = {
        val b : Byte = 10
        val s : Short = b
        val i : Int = s
        val lon : Long = i
	}
}

强制类型转化

基本说明

​ 自动类型转换的逆过程,将精度大的数值类型转换为京都小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出。

(1)将数据由高精度转换为低精度,就需要使用到强制类型转换

(2)强制符合只针对最近的操作数有效,往往会使用小括号提升优先级

Java语言

int a = 10;
byte b = (byte)a;

Scala语言

var a : Int = 10
Var b : Byte = a.toByte
val num: Int = 2.5.toInt
// 基本上Scala的AnyVal类型之间都提供了相应转换的方法。

字符串类型转化

scala是完全面向对象的语言,所有的类型都提供了toString方法,可以直接转换为字符串

lon.toString

任意类型都提供了和字符串进行拼接的方法

val i = 10
val s = "hello " + i

的逆过程,将精度大的数值类型转换为京都小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出。

(1)将数据由高精度转换为低精度,就需要使用到强制类型转换

(2)强制符合只针对最近的操作数有效,往往会使用小括号提升优先级

Java语言

int a = 10;
byte b = (byte)a;

Scala语言

var a : Int = 10
Var b : Byte = a.toByte
val num: Int = 2.5.toInt
// 基本上Scala的AnyVal类型之间都提供了相应转换的方法。

字符串类型转化

scala是完全面向对象的语言,所有的类型都提供了toString方法,可以直接转换为字符串

lon.toString

任意类型都提供了和字符串进行拼接的方法

val i = 10
val s = "hello " + i

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25

目录 前言初始化和清理的概念构造函数和析构函数的作用构造函数的作用析构函数的作用 使用构造函数和析构函数的注意事项默认的构造函数和析构函数结束语 前言 在使用c语言开发的项目场景中,我们往往会遇到申请空间的需求,同时也肯定遇到过程序运行一段…

数字IC基础协议篇(1)——I2C协议

数字IC基础协议篇(1)——I2C协议 写在前面的话I2C协议应用框图I2C数据格式协议注意点 I2C读写EEPROM例程(基于iverilog和gtkwave)软件环境要求 项目框图总结 写在前面的话 协议介绍: I2C(Inter-Integrated…

【CNN-FPGA开源项目解析】卷积层03--单格乘加运算单元PE 单窗口卷积块CU 模块

03–单格乘加运算单元PE & 单窗口卷积块CU 文章目录 03--单格乘加运算单元PE & 单窗口卷积块CU前言单格乘加运算单元PE代码模块结构时序逻辑分析对其上层模块CU的要求 单窗口卷积块CU代码逻辑分析 前言 ​ 第一和第二篇日志已经详细阐述了"半精度浮点数"的加…

Strtok函数切割字符串(附代码演示)

目录 1.认识Strtok函数 2.Strtok函数使用认识 3.Strtok使用代码示例 1.认识Strtok函数 C语言中的strtok函数是用来将字符串分割成若干个子串的函数。它的原型如上图所示 char *strtok(char *str, const char *delimiters);函数参数str为要被分割的字符串,参数del…

95 # express 二级路由的实现

上一节实现了兼容老的路由写法,这一节来实现二级路由 二级路由实现核心: 进入中间件后,让对应的路由系统去进行匹配操作中间件进去匹配需要删除 path,存起来出去时在加上 示意图: 代码实现如下: rout…

护理不良事件成因分析及预防措施,你知道哪些

不良事件上报管理系统源码 护理不良事件主要成因分析 1.查对制度不严:因不认真执行各种查对制度,而在实际护理工作中出现的不良事件仍占较高比例。具体表现在用药查对不严,只喊床号,不喊姓名,致使给患者输错…

【算法练习Day5】有效的字母异位词 两个数组的交集快乐数两数之和

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 有效的字母异位词两个数…

基于springboot+vue的青年公寓服务平台

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

K8SYaml文件详解及编写示例

文章目录 一.Yaml文件详解1.Yaml文件格式2.YAML 语法格式 二.Yaml文件编写及相关概念1.查看 api 资源版本标签2.yaml编写案例(1)相关标签介绍(2)Deployment类型编写nginx服务(3)k8s集群中的port介绍&#x…

Unity 内存性能分析器 (Memory Profiler)

一、 安装 安装有两种方式一: add package : com.unity.memoryprofiler方式二: From Packages : Unity Registry 搜索 Memory Profiler 二、 使用 打开:Windows - > Analysis - > Memory Profiler 打开MemoryProfiler界面&#xff0…

深入学习JVM(Java虚拟机)

目录 一.JDK、JRE、JVM的关系 1.1JDK(Java SE Development Kit) 1.2JRE( Java Runtime Environment) 1.3JVM(Java Virtual Machine) 1.4JDK、JRE、JVM的区别与联系 二.Class的生命周期 2.1加载 2.1.1 类加载器 2.1.2类加载机制 2.1.3双亲委派 2.2链接 2.2.1验证 2…

antd-vue 级联选择器默认值不生效解决方案

一、业务场景: 最近在使用Vue框架和antd-vue组件库的时候,发现在做编辑回显时** 级联选择器** 组件的默认值不生效。为了大家后面遇到和我一样的问题,给大家分享一下 二、bug信息: 三、问题原因: 确定不了唯一的值&a…

GEE:根据影像最小值和最大值自适应可视化参数设置

作者:CSDN @ _养乐多_ 本文将介绍根据影像最小值和最大值,自适应的设置影像可视化参数设置。 文章目录 一、核心函数二、代码示例三、代码链接一、核心函数 //计算影像的最小值和最大值,为了可视化 var imageMin = (image.reduceRegion({reduc

使用CRM管理销售渠道的 5 个重要优势

销售渠道的管理是创造积极客户体验的关键因素,对企业来说非常重要。大多数情况下,客户关系管理(CRM)系统可用于高效的销售渠道管理。那么,利用CRM系统管理销售渠道有哪些优势呢? 1) 有效的线索管理 销售渠…

CSS实现鼠标悬停图片上升显示

文章目录 前言一、实现效果二、实现思路 前言 当我们想在图片上面放置一些文字内容时,发现不管怎么放置,要么就是图片影响到文字的观感,要么就是文字挡住图片的细节,那么怎么可以既看到图片的细节又可以看到对图片的文字描述呢&a…

基于R语言分位数回归丨线性回归假设与分位数函数、线性分位数回归 、贝叶斯分位数回归、超越线性分位数回归等

目录 专题一 线性回归假设与分位数函数讲解 专题二 线性分位数回归 【代码实践】 专题三 贝叶斯分位数回归【代码实践】 专题四 超越线性分位数回归(一)【代码实践】 专题五 超越线性分位数回归(二)【代码实践】 更多应用 回…

怎样的外发文件管理办法 能够避免数据外发泄露?

在日常办公中,重要文件保密管理可谓“老生常谈”。但我们往往容易忽视,文件保密管理并非个体所能独立完成,在整个文件运转过程中,存在多名经手人,一人发生疏忽,则整个安全屏障都会被打破。 因此&#xff0c…

膝盖前交叉韧带断裂

等级、治愈(几乎不可能,除非康复阶段做得非常到位。手术后可恢复到90%),饮食,康复训练(完全康复)、心理作用 赔偿:工商(分出两份),伤残证&#x…

Spring Boot 如何实现单点登录(SSO)

当今的应用程序越来越多地采用了微服务架构,这就引出了一个重要的问题:如何实现单点登录(Single Sign-On,简称SSO)来确保用户在多个微服务之间无需重复登录。Spring Boot是一个流行的Java框架,它提供了一些…

旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著作想象和世界一样宽广

旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著作想象和世界一样宽广