前言

本篇主要讲Scala的基本数据类型,更多教程请参考:Scala教程

基本数据类型

Scala一共提供了9中数据类型,Scala的基本数据类型与java中的基本数据类型是一一对应的,这是Scala的数据类型全是类,并且头字母大写

整数类型变量定义:

//16进制
scala> val x = 0x29
x:Int = 41 //10进制
scala> val x = 41
x:Int = 41 //8进制
scala>051
res0:Int = 41

浮点型变量定义:

//Double类型定义,直接输入浮点数,编译器会将其自动推断为Double类型
scala> val doubleNumber = 3.1415
doubleNumber:Double = 3.1415 //要定义Float类型浮点数,需要浮点数后面加F或者f
scala> val floatNumber = 3.1415f
floatNumber:Float = 3.1415 //浮点型变量还可以用指数表示
scala>val floatNumber = 0.1314e1
floatNumber:Double = 1.314

字符变量定义:

//字符定义,用''将字符包裹
scala>var charLiteral='A'
charLiteral:Char='A'

常用特殊字符包括

\n换行符,其Unicode编码为(\u000A)
\b回退符,其Unicode编码为(\u0008)
\t tab制表符,其Unicode编码为(\u0009)
\" 双引号,其Unicode编码为(\u0022)
\' 单引号,其Unicode编码为(\u0027)
\反斜杠,其Unicode编码为(\u005C)

字符串变量定义:

//字符串变量用""包裹
scala> val helloWorld = "HelloWorld"
helloWorld:String = HelloWorld //要定义"Hello World",需要加上转义符
scala> val helloWorldDoubleQuote = "\"Hello World\""
helloWorldDoubleQuote:String = "Hello World" //如果希望能够原样输出字符串总的内容,则用三个引号"""将字符包裹
scala>println(""" hello cruel world, \n \\\ \b \\, I an""")
hello cruel world, \n \\\ \b \\, I an

布尔类型定义:

scala>var x = true
x:Boolean = true

Scala基本类型操作

因为Scala中一切皆对象,这意味着Scala中的一切操作都是对象的方法,包括基本的算术操作

算术操作:

//整数求和
scala> var sumValue = 1+2
sumValue: Int = 3 //等价于下面这句话
scala> var sumValue = (1).+(2)
sumValue:Int = 3 //操作符重载,编译器将会将其转换为(1).+(2L)执行
scala> val longSum = 1 + 2L
longSum: Long = 3 //减法
scala>1-3
res2:Int = -2 //除法
scala>1 / 3
res3:Int = 0 //取余
scala>1%3
res4:Int = 1 //乘法
scala>1*3L
res5:Long=3 //Scala中可以用+ -符号表示正负数,并且可以用来算术运算
scala>var y =1 + -3
y:Int = -2

关系运算:

//>运算符
scala> 3 > -3
res12: Boolean = true
//<运算符
scala> 3 < -3
res13: Boolean = false
//<=运算符
scala> 3 <= -3
res14: Boolean = false
//<=运算符
scala> 3 <=3
res15: Boolean = true
//<=运算符
scala> !(3<= -3)
res16: Boolean = true

逻辑运算

//逻辑与:&&
scala> val bool=true
bool: Boolean = true scala> bool && bool
res17: Boolean = true
//逻辑或:||
scala> bool || bool
res18: Boolean = true scala> bool || !bool
res20: Boolean = true

位运算:

// 00000001
// 00000010
// 00000000
scala> 1 & 2
res24: Int = 0 // 00000001
// 00000010
// 00000011
scala> 1 | 2
res24: Int = 3 // 00000001
// 00000011
// 00000010
scala> 1 ^ 3
res24: Int =2 //00000001
//11111110
scala> ~1
res24: Int =-2 //左移位(shift left)
//00000110
//00001100
scala> 6 << 1
res29: Int = 12 //右移位(shift left)
//00000110
//00000011
scala> 6 >> 1
res28: Int = 3 //无符号右移(shift left)
//11111111111111111111111111111111
//00000000000000000000000000000001
scala> -1 >>> 31
res32: Int = 1

对象比较:

scala> 1==1
res34: Boolean = true scala> 1==1.0
res35: Boolean = true scala> val x="Hello"
x: String = Hello scala> val y="Hello"
y: String = Hello //Scala中的对象比较不同于Java中的对象比较
//Scala基于内容比较,而java中比较的是引用,进行内容比较时须定义比较方法
scala> x==y
res36: Boolean = true

Scala程序控制结构

1、if的使用:

Scala的if/else语法结构和Java或C++一样。不过,在Scala中if/else表达式有值,这个值就是跟在if或者else之后的表达式的值。

val x =  if("hello" == "hell") 1 else 0
x:Int = 0

注意点:

1、Scala的表达式都有类型,比如上面的if/else,类型为Int,因为if和else分之的类型都是Int

2、假如上面的类型不一样,比如:
val x = if(x > 0) "positive" else -1
此时这两个类型就不一样了,其中一个分之是Int,而另一个分之是java.lang.String。此时这个表达式的类型是公共超类型Any。

3、如果else缺失了,比如:if(x > 0) 1
那么很可能if语句没有输出值,但是在Scala中,每个表达式都有值,此时,Scala提供了一个Unit类,写作(),上面的语句等价于: if(x > 0) 1 else ()
4、赋值语句的值是Unit类型的,所以
x = y = 1 //这样是错的

2、while的使用:

def gcbLoop(x:Long, y:Long):Long = {
var a = x
var b = y
while(a != 0){
val temp = a
a = b % a
b = tmep
}
b
}

do while的使用

var line = ""
do{
line = readLine()
println("Read: "+line)
}while(line != "")

注意点:与if不用的是,while与do while不能作为表达式,也即其返回值为Unit

利用if替代while控制结构
//这样做可以减少var变量的使用,程序结构也更简单,表达能力更强
def gcb(x:Long, y:Long):Long =
if(y == 0) x else gcb(y, x % y)
var line = ""
while((line = readLine()) != "") //在Scala中不能这么用,因为Scala中的赋值语句操作返回Unit
println("Read: "+line)

for循环的使用:

scala>val filesHere = (new java.io.File(".")).listFiles
//集合操作方式
scala>for(file <- filesHere)
| println(file) //简介调用方式
for(i <- 0 to filesHere.length - 1)
println(filesHere(i))

程序中的<-被称为(generator),在执行过程中,集合filesHere(Array[File])的元素将依次赋给file,file类型为File,打印将调用其toString()方法将文件名打印出来。

<-生成器对其类型的集合也使用

scala>1 to 5
res10:scala.collection.immutable.Range,Inclusive = Range(1, 2, 3, 4, 5) scala>for(i<- res10) println("Iteration: "+i)
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
Iteration: 5 //也可以直接写成
scala>for(i <- 1 to 5) println("Iteration: " +i)
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
Iteration: 5 //如果不包括5
scala>for(i <- 1 until 5) println("Iteration: "+i)
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4

在for循环中还可以加入if进行过滤操作

val filesHere = (new java.io.File(".")).listFiles
for (file <- filesHere if file.getName.endsWith(".scala"))
println(file)
//还可以加入多个过滤条件,用;隔开
for (
file <- filesHere
if file.isFile;
if file.getName.endsWith(".scala")
) println(file)

多重循环的实现

可以使用多个变量 <- 表达式的形式提供多个生成器,用分号将他们隔开

for(i <- 1 to 3; j <- 1 to 3) print((10 * i +j) + " ")
11 12 13 21 22 23 31 32 33

还可以使用if

for(i <- 1 to 3; j <- 1 to 3 if  i!= j) print((10 * i +j) + " ")
12 13 21 23 31 32

可以使用任意多的定义,引入可以再循环中使用

for(i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i) +j)
13 22 23 31 32 33

如果循环体以yield开始,则该循环体会构造一个集合,每次迭代生成集合中的一个值

for(i <- 1 to 10) yield i % 3
Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)

这类循环叫做for推导式

for推导式生成的集合与它的第一个生成器是类型兼容的。

def fileLines(file: java.io.File) =
scala.io.Source.fromFile(file).getLines.toList
def grep(pattern: String) =
for (
file <- filesHere
if file.getName.endsWith(".scala");
line <- fileLines(file)
if line.trim.matches(pattern)
) println(file +": "+ line.trim)
grep(".*gcd.*") //前一个for相当于下列语句
def grep(pattern: String) =
for (
file <- filesHere
if file.getName.endsWith(".scala")
)
for(
line <- fileLines(file)
if line.trim.matches(pattern)
)
println(file +": "+ line.trim)
grep(".*gcd.*")

生成返回结果

//每次循环将结果保留,当整个循环执行完毕,所有保留的值将会生成一个集合并返回
scala> def scalaFiles =
| for {
| file <- filesHere
| if file.getName.endsWith(".scala")
| } yield file
scalaFiles: Array[java.io.File] //Array[File]到Array[Int]的转换
scala> val forLineLengths =
| for {
| file <- filesHere
| if file.getName.endsWith(".scala")
| line <- fileLines(file)
| trimmed = line.trim
| if trimmed.matches(".*for.*")
| } yield trimmed.length
forLineLengths: Array[Int] = Array()

Scala学习笔记之二--基本数据类型的更多相关文章

  1. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  2. Python学习笔记(二)——数据类型

    1.数据类型 Python有五个标准的数据类型: Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典) 2.Python数字类型 Pyth ...

  3. Scala学习笔记(二)表达式和函数

    笔记的整理主要针对Scala对比Java的新特性:   1.if表达式 if表达式是有结果返回的. val a= if (5>2) "你好" else 1 a的值为if表达式 ...

  4. Scala学习笔记(二)——Scala基础

    1. 常用数据类型 Scala与Java有着相同的常用数据类型: Byte.Short.Int.Long.Float.Double.Chat.Boolean(只有包装类型,无原始类型) Scala继承 ...

  5. python学习笔记(二)— 数据类型

    一.变量.数据类型 1.计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同 ...

  6. Scala学习笔记(二):运行脚本文件

    在某个目录(如:F:\)下新建一个文本文件,命名为:hello.scala 其内容为: println("Hello World!") 那么这个时候该怎么运行这个脚本文件呢? 通过 ...

  7. Scala学习笔记(二)

    Scala面向对象: 类: 声明类(一个源文件中可以包含很多public的类) getter和setter 构造函数(主构造器和附属构造器) 继承(extends) 重写父类方法(override d ...

  8. Scala学习笔记(二):object、伴生对象和基本类

    object object 是只有一个实例的类.它的定义与Java中的class类似,如: // 单例对象 object AppEntry { def main(args: Array[String] ...

  9. scala 学习笔记十二 继承

    1.介绍 继承是面向对象的概念,用于代码的可重用性.可以通过使用extends关键字来实现继承. 为了实现继承,一个类必须扩展到其他类,被扩展类称为超类或父类.扩展的类称为派生类或子类. Scala支 ...

随机推荐

  1. mysql event_scheduler运行一段时间后 自动关闭

    应该是你重启过电脑或重启过服务了.  SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHO ...

  2. 【5集iCore3_ADP演示视频】5-4 iCore3与应用开发平台的组装与拆卸

    iCore3双核心应用开发平台基于iCore3双核心板,包含ARM.FPGA.7寸液晶屏.双通道数字示波器.任意波发生器.电压表等模块,是一款专为电子爱好者设计的综合性电子学习系统. [视频简介]本视 ...

  3. javascript:cors跨域postMessage、xhr2和xmldomain

    一.h5 postMessage node http-server配置服务器 有关配置:请参考我的http://www.cnblogs.com/leee/p/5502727.html 我把文件夹a配置 ...

  4. Ubuntu使用阿里云软件源

    如果在安装Ubuntu时,选择的地区为美国,建议更新为阿里云或国内 软件源 sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt ...

  5. CodeIgniter(CI)框架中的验证码

    在CodeIgniter框架中,CI本身自带了验证码,但是查看文档的时候,发现: 需要新建一个表,用来存储验证码信息.因为习惯了session存储验证码信息,所以我把我认为比较好看的验证码应用在了CI ...

  6. 掌握Thinkphp3.2.0----内置标签

    使用内置标签的时候,一定要注意闭合-----单标签自闭合,双标签对应闭合 标签的学习在于记忆和应用 一. 判断比较 //IF 语句的完整格式 <if condition="$user ...

  7. js 表单验证控制代码大全

    js表单验证控制代码大全 关键字:js验证表单大全,用JS控制表单提交 ,javascript提交表单:目录:1:js 字符串长度限制.判断字符长度 .js限制输入.限制不能输入.textarea 长 ...

  8. scala集合List和Set

    一:List集合 1.创建 2.简单使用(两个部分) 3.Nill空集合 4.创建一个可变的list集合 二:Set 1.说明 无序,不重复 2.新建 3.可变

  9. 【Html 学习笔记】第二节——文本格式

    上一节基本已经了解了一些html的基础,这一节主要学习html处理文本相关内容,直接看内容吧. 字体: 预格式文本:<pre> 地址:<address> 缩写:<abbr ...

  10. 罗永浩专访全文记录(转自好奇心日报-http://www.qdaily.com/)

    这篇文章是转的,存档做记录,定期看一看,激励自己遇到到困难时,想想人家比自己难多了,自己那点事算个屁啊.学习别人,不要带有傻逼主观倾向性,这样什么也得不到,我看完后,发现有一句话,说的非常好,自己有自 ...