scala数据类型

scala安装使用教程_一篇搞定!-CSDN博客
1.7 Scala数据类型
复制代码
# Any是所有类型的父类
    它定义了一些通用的方法如equals、hashCode和toString。Any有两个直接子类:AnyVal和AnyRef。
# AnyVal是所有值类型的父类
    有9个预定义的非空的值类型分别是:Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是不带任何意义的值类型,它仅有一个实例可以像这样声明:()。所有的函数必须有返回,所以说有时候Unit也是有用的返回类型。
# AnyRef是所有引用类型的父类
    AnyRef代表引用类型。所有非值类型都被定义为引用类型。在Scala中,每个用户自定义的类型都是AnyRef的子类型。如果Scala被应用在Java的运行环境中,AnyRef相当于java.lang.Object。
# Nothing是所有类型的子类
    Nothing是所有类型的子类,也是Null的子类,他没有一个具体的实例对象,常见的应用如:抛出异常、程序exit,无限循环等,返回值为Nothing类型。
    Nothing没有对象,但是可以用来定义类型。例如,如果一个方法抛出异常,则异常的返回值类型就是Nothing(虽然不会返回) 。
  def get(index:Int):Int = {
    if(x < 0) throw new Exception(...)  //返回值类型Nothing
    else ....
  }
  
# Null是所有引用类型的子类
    Null只有一个实例对象null,主要用来和其他的JVM语言进行互操作,但是几乎不应该在Scala代码中使用。

Scala 与 Java有着相同的数据类型:

数据类型 描述
Byte 8位有符号补码整数。数值区间为 -128 到 127
Short 16位有符号补码整数。数值区间为 -32768 到 32767
Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float 32 位, IEEE 754标准的单精度浮点数
Double 64 位 IEEE 754标准的双精度浮点数
Char 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
String 字符序列
Boolean true或false
Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Null null
Nothing Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
Any Any是所有其他类的超类
AnyRef AnyRef类是Scala里所有引用类(reference class)的基类

Scala数据类型的位数,不受具体OS的影响,以保证Scala程序的可移植性。

1.7.1 值类型AnyVal

Scala和Java一样,有8种数值类型Byte、Char、Short、Int、Long、Float、Double和一个Boolean类型,和Java不同的是 ,Scala没有基本类型与包装类型之分,这些类型都是类,有自己的属性和方法。

bash 复制代码
// 相当于Java的包装类;
1.toString()
1.to(10)
1.7.1.1 整型

Byte

复制代码
// 直接使用整数赋值时,会被判断为Int类型,需要定义时指定类型
var b: Byte = 2     //b为变量,2为字面量

Short

复制代码
// 直接使用整数赋值时,会被判断为Int类型,需要定义时指定类型
var s: Short = -3
// 低精度可直接隐式转换为高精度
s = b // Byte->Short

Int

复制代码
// 可以直接使用数字赋值
var i = 5
// 低精度可直接隐式转换为高精度
i = b // Byte->Int
i = s // Short->Int

Long

复制代码
// 直接使用小数赋值时,会被判断为Int,需要在小数后添加字母L
var l = 200L
var l1: Long = 200L
// 低精度可直接隐式转换为高精度
l = b // Byte->Long
l = s // Short->Long
l = i // Int->Long
1.7.1.2 Unit
复制代码
// Unit为空类型,相当于void,使用()进行初始化
var u = ()
1.7.1.3 Boolean
复制代码
// 定义Boolean类型,只能为true或者false
var b1 = false
var b2: Boolean = true
1.7.2 类型转换
1.7.2.1 自动类型转换

值类型可以按照下面的方向进行转换:

复制代码
val x: Long = 987654321
val y: Float = x  // 9.8765434E8 (note that some precision is lost in this case)

当Double转为Int时,错误如下:

复制代码
scala> val i:Int=10d
<console>:11: error: type mismatch;
 found   : Double(10.0)
 required: Int
       val i:Int=10d
1.7.2.2 强制类型转换

Java中的强制类型转换:

复制代码
int a = (int) 100.00;

scala中处理:

cpp 复制代码
//toByte     toChar     toDouble   toFloat    toInt      toLong
//toShort    toString
scala> val a = 19.9
a: Double = 19.9
scala> val b = a.toInt
b: Int = 19
scala> val c=a.asInstanceOf[Int] //类似Java中的强制类型转换:(int)a
c: Int = 19

Scala与Java类型检查和转换对比

Scala Java
obj.isInstanceOf[C] obj instanceof C
obj.asInstanceOf[C] (C)obj
classOf[C] C.class
1.7.2.3 数值类型和字符串类型的转换

数值类型转字符串类型

复制代码
val s1 = true+""
val s2 = 3.1415+""
val s3 = 100 +""

字符串类型转数值类型

复制代码
val s4 = "3.14"
s4.toDouble

小结:

低位数可以向高位数数转换。如Byte->Short

字符可以转整形或浮点型,不同长度字符应使用不同位数的整型

整型可以转浮点型,允许精度丢失。如Long->Float

代码

Scala 复制代码
package com.qianfeng.scala
​
/**
* 变量必须赋值或者是使用占位符初始化
* val 变量名称[:类型] = 值   : 不可变 ,相当于java的final修饰
* var 变量名称[:类型] = 值   : 可变
* lazy val 变量名称[:类型] = 值  懒加载,必须使用val
*
* 注意:
* 1、官方推荐我们使用val
* 2、类型自动推断
*/
object Demo02_Variable {
  def main(args: Array[String]): Unit = {
    val a = 100
    val b:String = "abc"
    println(a)
    //修改a的值
    //a = 200  //报错:不能改变值
​
    var c = 100
    println(c)
    c = 200
    println(c)
​
    lazy val d = 1000
    println(d)
​
    //lazy var dd = 1000   //报错:lazy只能修饰val变量
​
    //多变量
    val (aa,cc,dd) = (1,2,"hello")
    println(aa,dd)
    val i1,i2 = 10
    println(i1,i2)
​
​
    //类型定义
    val i3 = 200L  //定义Long类型
    var u = ()  //定义unit类型
    println(i3,u)
​
    //转换
    //val i4:Int = i3   //不能直接转
    val i4:Int = i3.toInt
    val i5:Double = 3.14F
    //val i6:Int = 3.14D //不能直接转
    println(i4,i5)
​
    //val b2Int = b.toInt //
    val i7 = "12"
    val i8 = i7.toInt //字符串转int
    val i9 = i8+""  //int转字符串
    println(i9.isInstanceOf[String])
    println(i8.isInstanceOf[Int])
  }
}
​
相关推荐
·云扬·几秒前
Lambda 表达式详解
java·开发语言·笔记·学习·1024程序员节
linhhanpy8 分钟前
自制操作系统(九、操作系统完整实现)
c语言·开发语言·汇编·c++·操作系统·自制操作系统
ACALJJ328 分钟前
STL整理
开发语言·c++
豆本-豆豆奶11 分钟前
最全面的Python重点知识汇总,建议收藏!
开发语言·数据库·python·oracle
Bosenya1214 分钟前
【信号处理】绘制IQ信号时域图、星座图、功率谱
开发语言·python·信号处理
monkey_meng14 分钟前
【Rust Crate之Actix Web(一)】
开发语言·后端·rust
AI原吾32 分钟前
探索PyAV:Python中的多媒体处理利器
开发语言·python·ai·pyav
oliveira-time42 分钟前
爬虫学习8
开发语言·javascript·爬虫·python·算法
正义的彬彬侠1 小时前
XGBoost算法Python代码实现
python·决策树·机器学习·numpy·集成学习·boosting·xgboost
矛取矛求1 小时前
string接口的深度理解(内附思维导图)
c语言·开发语言·c++·接口·string