前言

本篇主要讲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. 团队作业week9 scenario testing

    1.How do you expect different personas to use your software? What’s their need and their goals,  how ...

  2. 使用File类列出指定位置的文件信息,包含该路径子目录下的文件信息

    public class Test{ public static void main(String [] args) { File f=new File("d:"); File [ ...

  3. 如何提高Java并行程序性能??

    在Java程序中,多线程几乎已经无处不在.与单线程相比,多线程程序的设计和实现略微困难,但通过多线程,我们却可以获得多核CPU带来的性能飞跃,从这个角度说,多线程是一种值得尝试的技术.那么如何写出高效 ...

  4. 不修改代码就能优化ASP.NET网站性能的一些方法

    阅读目录 开始 配置OutputCache 启用内容过期 解决资源文件升级问题 启用压缩 删除无用的HttpModule 其它优化选项 本文将介绍一些方法用于优化ASP.NET网站性能,这些方法都是不 ...

  5. 安装oracle 11g时出现启动服务出现错误,找不到OracleMTSRecoveryService

    运行注册表(cmd-输入regedit),到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,找到OracleMTSRecoveryServ ...

  6. 【javaweb学习】解析XML

    XML解析方式有两种 dom:Document Object Model文档对象模型,是w3c组织推荐的解析方式 sax:Simple Api XML不是官方标准,但它是XML社区实际上的标准,几乎所 ...

  7. web应用程序开发原理

    企业应用计算的演变为1.主机/哑终端的集中计算模式: 2.客户机/服务器计算模式:3.浏览器    /服务器计算模式.其中,1具有部署方面的优势,但在一台计算机中进行全部的处理,应用程序难于维护,难于 ...

  8. vert.x学习(八),用JDBCClient配合c3p0操作数据库

    今天学习了下vert.x的JDBCClient,我这里将今天的学习笔记记录下来.这次学习中使用了c3p0. 用使用JDBCClient和c3p0得现在pom.xml文件里面导入对应的依赖,下面贴出xm ...

  9. 测试post接口curl

    function post($url,$data=array()) { if ( !empty($data) ) { $data=http_build_query($data); } $ch = cu ...

  10. 快速原型设计工具-Axure RP的介绍及简单使用(生产初期向客户展示设计产品的原型-也就是展示产品)

    啧啧~~ 给大家介绍一款超棒的原型设计工具--美国Axure Software Solution公司旗舰产品Axure RP 这款工具通俗的说呢,就是在项目整体需求考察后对整体设计一个简要性概括!设计 ...