Scala入门到精通—— 第二节Scala基本类型及操作、程序控制结构

来源:互联网 发布:初中数学教学软件 编辑:程序博客网 时间:2024/05/22 10:41

本节主要内容

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

Scala基本类型

Scala中的基本数据类型如下图:
这里写图片描述
(来源:Programming in Scala)

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

整数类型变量定义:

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

浮点类型变量定义:

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

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

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

字符变量定义:

//字符定义,用''将字符包裹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="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=truex: Boolean = true

Scala基本类型操作

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

算术操作:

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

关系运算:

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

逻辑运算:

//逻辑与:&&scala> val bool=truebool: Boolean = truescala> bool && boolres17: Boolean = true//逻辑或:||scala> bool || boolres18: Boolean = truescala> bool || !boolres20: Boolean = true

位运算:

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

对象比较:

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

运算符的优先级:
运算符优先级如下图所示,* / %优先级最高,依次类推
这里写图片描述
图片来源:Programming in Scala

Scala程序控制结构

if 的使用:

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

while 的使用:

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

do while的使用

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

注意:与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)
var line = ""while ((line = readLine()) != "") // 在Scala中不能这么用,因为Scala中的赋值操作返回的值是Unit,而""是String类型,不能进行比较,这是函数式编程语言特有的特点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> val filesHere = (new java.io.File(".")).listFilesfilesHere: Array[java.io.File] = Array(.\.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}.TMContainer00000000000000000001.regtrans-ms, .\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer00000000000000000002.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}.TMContainer00000000000000000001.regtrans-ms.\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer00000000000000000002.regtrans-ms.\ntuser.ini.\Pictures.\PrintHood.\Recent.\Roaming.\Saved Games.\Searches.\SendTo.\target.\Templates.\Videos.\「开始」菜单

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

scala> 1 to 5res39: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)scala> for(i <- res39) println("Iteration"+i)Iteration1Iteration2Iteration3Iteration4Iteration5也可直接简写成scala> for(i <- 1 to 5) println("Iteration"+i)Iteration1Iteration2Iteration3Iteration4Iteration5//如果不需要5出现,则用scala> for(i <- 1 until 5) println("Iteration"+i)Iteration1Iteration2Iteration3Iteration4

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

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

//多重循环的实现:

def fileLines(file: java.io.File) =scala.io.Source.fromFile(file).getLines.toListdef grep(pattern: String) =for (file <- filesHereif 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 <- filesHereif 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 filescalaFiles: 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.lengthforLineLengths: Array[Int] = Array()

添加公众微信号,可以了解更多最新Spark、Scala相关技术资讯
这里写图片描述

1 3
原创粉丝点击