scala 基本类型和操作

Scala基本类型

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

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

整数类型变量定义:

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

浮点类型变量定义:

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

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

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

字符变量定义:

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

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

字符串变量定义:

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

布尔类型定义:

  1.  
    scala> var x=true
  2.  
    x: Boolean = true

Scala基本类型操作

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

算术操作:

  1.  
    //整数求和,编译器会将其转换为(1).+(2)执行
  2.  
    scala> var sumVlaue=1+2
  3.  
    sumVlaue: Int = 3
  4.  
     
  5.  
    //前一语句等同于下列语句
  6.  
    scala> var sumVlaue=(1).+(2)
  7.  
    sumVlaue: Int = 3
  8.  
     
  9.  
    //操作符重载,编译器会将其转换为(1).+(2L)执行
  10.  
    scala> val longSum = 1 + 2L
  11.  
    longSum: Long = 3
  12.  
     
  13.  
    //减法
  14.  
    scala> 1-3
  15.  
    res5: Int = -2
  16.  
     
  17.  
    //除法
  18.  
    scala> 1/3
  19.  
    res6: Int = 0
  20.  
     
  21.  
    //取模
  22.  
    scala> 1%3
  23.  
    res7: Int = 1
  24.  
     
  25.  
    //乘法
  26.  
    scala> 1L*3L
  27.  
    res8: Long = 3
  28.  
     
  29.  
    //scala中可以用+ -符号来表示正负数,例如-3 +3,并且可以加入到运算符当中
  30.  
    scala> var y=1+ -3
  31.  
    y: Int = -2
  • 7

关系运算:

  1.  
    //>运算符
  2.  
    scala> 3 > -3
  3.  
    res12: Boolean = true
  4.  
    //<运算符
  5.  
    scala> 3 < -3
  6.  
    res13: Boolean = false
  7.  
    //<=运算符
  8.  
    scala> 3 <= -3
  9.  
    res14: Boolean = false
  10.  
    //<=运算符
  11.  
    scala> 3 <=3
  12.  
    res15: Boolean = true
  13.  
    //<=运算符
  14.  
    scala> !( 3<= -3)
  15.  
    res16: Boolean = true
  • 1

逻辑运算:

  1.  
    //逻辑与:&&
  2.  
    scala> val bool=true
  3.  
    bool: Boolean = true
  4.  
     
  5.  
    scala> bool && bool
  6.  
    res17: Boolean = true
  7.  
    //逻辑或:||
  8.  
    scala> bool || bool
  9.  
    res18: Boolean = true
  10.  
     
  11.  
     
  12.  
    scala> bool || !bool
  13.  
    res20: Boolean = true
  • 3

位运算:

  1.  
    // 00000001
  2.  
    // 00000010
  3.  
    // 00000000
  4.  
    scala> 1 & 2
  5.  
    res24: Int = 0
  6.  
     
  7.  
    // 00000001
  8.  
    // 00000010
  9.  
    // 00000011
  10.  
    scala> 1 | 2
  11.  
    res24: Int = 3
  12.  
     
  13.  
    // 00000001
  14.  
    // 00000011
  15.  
    // 00000010
  16.  
    scala> 1 ^ 3
  17.  
    res24: Int =2
  18.  
     
  19.  
    //00000001
  20.  
    //11111110
  21.  
    scala> ~ 1
  22.  
    res24: Int =-2
  23.  
     
  24.  
    //左移位(shift left)
  25.  
    //00000110
  26.  
    //00001100
  27.  
    scala> 6 << 1
  28.  
    res29: Int = 12
  29.  
     
  30.  
    //右移位(shift left)
  31.  
    //00000110
  32.  
    //00000011
  33.  
    scala> 6 >> 1
  34.  
    res28: Int = 3
  35.  
     
  36.  
    //无符号右移(shift left)
  37.  
    //11111111111111111111111111111111
  38.  
    //00000000000000000000000000000001
  39.  
    scala> -1 >>> 31
  40.  
    res32: Int = 1
  • 1
  • 2

对象比较:

  1.  
    scala> 1==1
  2.  
    res34: Boolean = true
  3.  
     
  4.  
    scala> 1==1.0
  5.  
    res35: Boolean = true
  6.  
     
  7.  
    scala> val x= "Hello"
  8.  
    x: String = Hello
  9.  
     
  10.  
    scala> val y= "Hello"
  11.  
    y: String = Hello
  12.  
     
  13.  
    //Scala中的对象比较不同于Java中的对象比较
  14.  
    //Scala基于内容比较,而java中比较的是引用,进行内容比较时须定义比较方法
  15.  
    scala> x==y
  16.  
    res36: Boolean = true
  • 1

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

Scala程序控制结构

if 的使用:

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

while 的使用:

  1.  
    def gcdLoop(x: Long, y: Long): Long = {
  2.  
    var a = x
  3.  
    var b = y
  4.  
    while (a != 0) {
  5.  
    val temp = a
  6.  
    a = b % a
  7.  
    b = temp
  8.  
    }
  9.  
    b
  10.  
    }
  • 2

do while的使用

  1.  
    var line = ""
  2.  
    do {
  3.  
    line = readLine()
  4.  
    println("Read: "+ line)
  5.  
    } while (line != "")
  • 1

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

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

for循环的使用

  1.  
    scala> val filesHere = ( new java.io.File(".")).listFiles
  2.  
    //集合操作方式
  3.  
    scala> for (file <- filesHere)
  4.  
    | println(file)
  5.  
     
  6.  
    //间接调用方式(不常用)
  7.  
    for (i <- 0 to filesHere.length - 1)
  8.  
    println(filesHere(i))
  • 1

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

  1.  
    scala> val filesHere = ( new java.io.File(".")).listFiles
  2.  
    filesHere: Array [java.io.File] = Array(.\.android, .\.idea-build, .\.IdeaIC14, .
  3.  
    \.ivy2, .\.m2, .\.sbt, .\.scala_history, .\AppData, .\Application Data, .\Contac
  4.  
    ts, . \Cookies, .\Desktop, .\Documents, .\Downloads, .\Favorites, .\hello, .\Link
  5.  
    s, . \Local Settings, .\Music, .\My Documents, .\NetHood, .\NTUSER.DAT, .\ntuser.
  6.  
    dat.LOG1, . \ntuser.dat.LOG2, .\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.
  7.  
    TM.blf, . \NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer0000000000
  8.  
    0000000001.regtrans-ms, .\NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMCon
  9.  
    tainer00000000000000000002.regtrans-ms, . \ntuser.ini, .\Pictures, .\PrintHood, .
  10.  
    \Recent, .\Roaming, .\Saved Games, .\Searches, .\SendTo, .\target, .\Templates,
  11.  
    . \Videos, .\「开始」菜单)
  12.  
     
  13.  
    scala> for (file <- filesHere)
  14.  
    | println(file)
  15.  
    . \.android
  16.  
    . \.idea-build
  17.  
    . \.IdeaIC14
  18.  
    . \.ivy2
  19.  
    . \.m2
  20.  
    . \.sbt
  21.  
    . \.scala_history
  22.  
    . \AppData
  23.  
    . \Application Data
  24.  
    . \Contacts
  25.  
    . \Cookies
  26.  
    . \Desktop
  27.  
    . \Documents
  28.  
    . \Downloads
  29.  
    . \Favorites
  30.  
    . \hello
  31.  
    . \Links
  32.  
    . \Local Settings
  33.  
    . \Music
  34.  
    . \My Documents
  35.  
    . \NetHood
  36.  
    . \NTUSER.DAT
  37.  
    . \ntuser.dat.LOG1
  38.  
    . \ntuser.dat.LOG2
  39.  
    . \NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TM.blf
  40.  
    . \NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer000000000000000000
  41.  
    01.regtrans-ms
  42.  
    . \NTUSER.DAT{016888bd-6c6f-11de-8d1d-001e0bcde3ec}.TMContainer000000000000000000
  43.  
    02.regtrans-ms
  44.  
    . \ntuser.ini
  45.  
    . \Pictures
  46.  
    . \PrintHood
  47.  
    . \Recent
  48.  
    . \Roaming
  49.  
    . \Saved Games
  50.  
    . \Searches
  51.  
    . \SendTo
  52.  
    . \target
  53.  
    . \Templates
  54.  
    . \Videos
  55.  
    . \「开始」菜单
  • 1

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

  1.  
    scala> 1 to 5
  2.  
    res39: scala.collection.immutable. Range.Inclusive = Range(1, 2, 3, 4, 5)
  3.  
     
  4.  
    scala> for(i <- res39) println("Iteration"+i)
  5.  
    Iteration1
  6.  
    Iteration2
  7.  
    Iteration3
  8.  
    Iteration4
  9.  
    Iteration5
  10.  
     
  11.  
    也可直接简写成
  12.  
    scala> for(i <- 1 to 5) println("Iteration"+i)
  13.  
    Iteration1
  14.  
    Iteration2
  15.  
    Iteration3
  16.  
    Iteration4
  17.  
    Iteration5
  18.  
     
  19.  
    //如果不需要5出现,则用
  20.  
    scala> for(i <- 1 until 5) println("Iteration"+i)
  21.  
    Iteration1
  22.  
    Iteration2
  23.  
    Iteration3
  24.  
    Iteration4
  • 4

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

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

//多重循环的实现:

  1.  
    def fileLines( file: java.io.File) =
  2.  
    scala.io.Source.fromFile( file).getLines.toList
  3.  
    def grep(pattern: String) =
  4.  
    for (
  5.  
    file <- filesHere
  6.  
    if file.getName.endsWith(".scala");
  7.  
    line <- fileLines( file)
  8.  
    if line.trim.matches(pattern)
  9.  
    ) println( file +": "+ line.trim)
  10.  
    grep(".*gcd.*")
  11.  
     
  12.  
    //前一个for相当于下列语句
  13.  
    def grep(pattern: String) =
  14.  
    for (
  15.  
    file <- filesHere
  16.  
    if file.getName.endsWith(".scala")
  17.  
    )
  18.  
    for(
  19.  
    line <- fileLines( file)
  20.  
    if line.trim.matches(pattern)
  21.  
    )
  22.  
    println( file +": "+ line.trim)
  23.  
    grep(".*gcd.*")

生成返回结果

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

猜你喜欢

转载自www.cnblogs.com/duanxz/p/9461455.html