本节主要内容

  1. Scala基本类型
  2. 基本类型操作
  3. Scala程序控制结构

Scala基本类型

Scala中的基本数据类型如下图:

(来源:Programming in scala)

从上表中可以看出,Scala的基本数据类型与Java中的基本数据类型是一一对应的,不同的是Scala的基本数据类型头字母必须大写,本节以Int、Long、String、Char、Double及Float类型为例介绍Scala的基本类型定义

整数类型变量定义:

//16进制定义法
scala> val x=0x29
x: Int = 41
  • 1
//十进制定义法
scala> val x=41
x: Int = 41
//八进制定义法
scala> 051
res0: Int = 41

浮点类型变量定义:

//Double类型定义,直接输入浮点数,编译器会将其自动推断为Double类型
scala> val doubleNumber=3.141529
doubleNumber: Double = 3.141529
//要定义Float类型浮点数,需要在浮点数后面加F或f
scala> val floatNumber=3.141529F
floatNumber: Float = 3.141529scala> val floatNumber=3.141529f
floatNumber: Float = 3.141529
  • 1

浮点类型的变量还可以采用指数表示法,如

//浮点数指数表示法,e也可以是大写E,0.314529e1与0.314529*10等同
scala> val floatNumber=0.314529e1
floatNumber: Double = 3.14529
  • 1

字符变量定义:

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

常用特殊字符包括
\n 换行符,其Unicode编码为 (\u000A)
\b 回退符,其Unicode编码为 (\u0008)
\t tab制表符 ,其Unicode编码(\u0009)
\” 双引号,其Unicode编码为 (\u0022)
\’ 单引号,其Unicode编码为 (\u0027)
\ 反斜杆,其Unicode编码为(\u005C)

字符串变量定义:

//字符串变量用""包裹
scala> val helloWorld="Hello World"
helloWorld: String = Hello World//要定义"Hello World",可以加入转义符\
scala> val helloWorldDoubleQuote="\"Hello World\""
helloWorldDoubleQuote: String = "Hello World"//如果希望能够原样输出字符串中的内容,则用三个引号"""将字符串包裹起来,如
scala> println(""" hello cruel world, \n \\\\ \b \\, I am " experienced" programmer""")hello cruel world, \n \\\\ \b \\, I am " experienced" programmer

布尔类型定义:

scala> var x=true
x: Boolean = true

Scala基本类型操作

在Scala中一切操作皆方法,这意味着Scala中的一切皆为对象

算术操作:

//整数求和,编译器会将其转换为(1).+(2)执行
scala> var sumVlaue=1+2
sumVlaue: Int = 3//前一语句等同于下列语句
scala> var sumVlaue=(1).+(2)
sumVlaue: Int = 3//操作符重载,编译器会将其转换为(1).+(2L)执行
scala> val longSum = 1 + 2L
longSum: Long = 3//减法
scala> 1-3
res5: Int = -2//除法
scala> 1/3
res6: Int = 0//取模
scala> 1%3
res7: Int = 1//乘法
scala> 1L*3L
res8: Long = 3//scala中可以用+ -符号来表示正负数,例如-3 +3,并且可以加入到运算符当中
scala> var y=1+ -3
y: Int = -2
  • 7

关系运算:

//>运算符
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
  • 1

逻辑运算:

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

位运算:

// 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
  • 1
  • 2

对象比较:

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

运算符的优先级:
运算符优先级如下图所示,* / %优先级最高,依次类推

图片来源:Programming in Scala

Scala程序控制结构

if 的使用:

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

while 的使用:

def gcdLoop(x: Long, y: Long): Long = {var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp} b
}
  • 2

do while的使用

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

注意:与if不同的是,while与do while不能用作表达式,也即其返回值为Unit,在某些函数式编程语言中,删除了while与do while程序控制结构,但scala仍然保留了while与do while,可见Scala并不是纯函数式编程语言(另外一个重要原因是,scala函数定义时仍然可以用var指定参数)。

//利用if替代while控制结构
//这些做可以减少var变量的使用,程序结构也更简单,表达能力更强
def gcd(x: Long, y: Long): Long =
if (y == 0) x else gcd(y, x % y)
  • 3
var line = ""
while ((line = readLine()) != "") // 在Scala中不能这么用,因为Scala中的赋值操作返回的值是Unit,而""是String类型,不能进行比较,这是函数式编程语言特有的特点
println("Read: "+ line)
  • 2

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))
  • 1

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

scala> val filesHere = (new java.io.File(".")).listFiles
filesHere: Array[java.io.File] = Array(.\.android, .\.idea-build, .\.IdeaIC14, .
\.ivy2, .\.m2, .\.sbt, .\.scala_history, .\AppData, .\Application Data, .\Contac
ts, .\Cookies, .\Desktop, .\Documents, .\Downloads, .\Favorites, .\hello, .\Link
s, .\Local Settings, .\Music, .\My Documents, .\NetHood, .\NTUSER.DAT, .\ntuser.
dat.LOG1, .\ntuser.dat.LOG2, .\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.
TM.blf, .\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer0000000000
0000000001.regtrans-ms, .\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMCon
tainer00000000000000000002.regtrans-ms, .\ntuser.ini, .\Pictures, .\PrintHood, .
\Recent, .\Roaming, .\Saved Games, .\Searches, .\SendTo, .\target, .\Templates,
.\Videos, .\「开始」菜单)scala> for (file <- filesHere)| println(file)
.\.android
.\.idea-build
.\.IdeaIC14
.\.ivy2
.\.m2
.\.sbt
.\.scala_history
.\AppData
.\Application Data
.\Contacts
.\Cookies
.\Desktop
.\Documents
.\Downloads
.\Favorites
.\hello
.\Links
.\Local Settings
.\Music
.\My Documents
.\NetHood
.\NTUSER.DAT
.\ntuser.dat.LOG1
.\ntuser.dat.LOG2
.\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TM.blf
.\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer000000000000000000
01.regtrans-ms
.\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer000000000000000000
02.regtrans-ms
.\ntuser.ini
.\Pictures
.\PrintHood
.\Recent
.\Roaming
.\Saved Games
.\Searches
.\SendTo
.\target
.\Templates
.\Videos
.\「开始」菜单
  • 1

<-生成器对其它类型的集合也适用,

scala> 1 to 5
res39: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)scala> for(i <- res39) println("Iteration"+i)
Iteration1
Iteration2
Iteration3
Iteration4
Iteration5也可直接简写成
scala> for(i <- 1 to 5) println("Iteration"+i)
Iteration1
Iteration2
Iteration3
Iteration4
Iteration5//如果不需要5出现,则用
scala> for(i <- 1 until 5) println("Iteration"+i)
Iteration1
Iteration2
Iteration3
Iteration4
  • 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)

//多重循环的实现:

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入门到精通—— 第二节Scala基本类型及操作、程序控制结构相关推荐

  1. Scala入门到精通——第二十三节 高级类型 (二)

    本节主要内容 中置类型(Infix Type) 存在类型 函数类型 抽象类型 关于语法糖的问题,在讲解程序语言时,我们常常听到"语法糖"这个术语,在百度百科中,它具有如下定义: 语 ...

  2. Scala入门到精通——第一节 Scala语言初步

    本节主要内容 Scala简介 为什么要学习Scala Scala语言初步 1. Scala简介 Scala(scala Language的简称)语言是一种能够运行于JVM和.Net平台之上的通用编程语 ...

  3. Scala入门到精通——第二十九节 Scala数据库编程

    本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...

  4. Scala入门到精通——第二十四节 高级类型 (三)

    本节主要内容 Type Specialization Manifest.TypeTag.ClassTag Scala类型系统总结 在Scala中,类(class)与类型(type)是两个不一样的概念. ...

  5. Scala入门到精通——第二十八节 Scala与JAVA互操作

    本节主要内容 JAVA中调用Scala类 Scala中调用JAVA类 Scala类型参数与JAVA泛型互操作 Scala与Java间的异常处理互操作 1. JAVA中调用Scala类 Java可以直接 ...

  6. Scala入门到精通——第九节 继承与组合

    主要内容 类的继承 构造函数执行顺序 方法重写 匿名类 多态与动态绑定 组合与继承的使用 1 类的继承 下类的代码演示了Scala类的继承 //Person类 class Person(name:St ...

  7. Scala入门到精通——第二十七节 Scala操纵XML

    本节主要内容 XML 字面量 XML内容提取 XML对象序列化及反序列化 XML文件读取与保存 XML模式匹配 1. XML 字面量 XML是一种非常重要的半结构化数据表示方式,目前大量的应用依赖于X ...

  8. Scala入门到精通——第二十六节 Scala并发编程基础

    本节主要内容 Scala并发编程简介 Scala Actor并发编程模型 react模型 Actor的几种状态 Actor深入使用解析 1. Scala并发编程简介 2003 年,Herb Sutte ...

  9. Scala入门到精通——第二十五节 提取器(Extractor)

    本节主要内容 apply与unapply方法 零变量或变量的模式匹配 提取器与序列模式 scala中的占位符使用总结 1. apply与unapply方法 apply方法我们已经非常熟悉了,它帮助我们 ...

最新文章

  1. 计算机原理与基础 —— 进制之间的转换(二进制与十、八、十六禁止之间的转换)
  2. propertysource注解 找不到文件_WinXP系统电脑开机提示windows找不到null文件的解决方法...
  3. liferay 点击build service 出现Cloud not reserve enough space for object heap
  4. 电子设计竞赛电源题(2)-检波与采样
  5. happens-before规则和as-if-serial语义
  6. 拓扑排序以及拓扑排序算法
  7. 计算机常用压缩软件有哪些,电脑用什么解压缩软件比较好?
  8. Mac 禁止插上手机自动启动iTunes
  9. 华为手机连接电脑,无法使用USB调试或者无USB连接弹窗的问题
  10. DNS、HTTP劫持的一些事
  11. zookeeper初步
  12. 京东上的神器,评论区的问答蛮搞的
  13. 201771010101 白玛次仁
  14. [下载]《SAP R/3 IDES 4.71 中文版》
  15. python爬取手机app图片_python 手机app数据爬取
  16. 杨辉三角中第 n 行第 m 个数字
  17. 强网杯2018 - nextrsa - Writeup
  18. Acwing:COW(DP+状态机 Python)
  19. win10计算机怎么连接网络,如何创建宽带连接_win10电脑宽带连接怎么创建 - 驱动管家...
  20. [牛客算法总结]:旋转字符串

热门文章

  1. java静态局部变量_java中成员变量,局部变量,静态变量的辨析
  2. php动态渲染和静态渲染,php,vue,vue-ssr 做出来的页面有什么区别?
  3. mysql 云主机名_mysql部署到云主机的笔记
  4. Java连接SQL2005及SQL Server JDBC Driver 2.0中sqljdbc.jar和sqljdbc4.jar的区别
  5. HTML 取消超链接下划线
  6. r生成新的dataframe_2020-08-11R语言中dataframe与list的转换方法
  7. 安卓linux环境 查看进程,查看基于Android 系统单个进程内存、CPU使用情况的几种方法...
  8. java圆饼图插件_饼图----插件
  9. python怎样打开加密的文件_python基础教程如何用Python 加密文件
  10. 关于鸿蒙工艺调查分析报告,800万芯片订单已下,5nm工艺+鸿蒙系统,华为做了双重准备...