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.141529

scala> val floatNumber=3.141529f

floatNumber: Float = 3.141529

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

//浮点数指数表示法,e也可以是大写E,0.314529e1与0.314529*10等同

scala> val floatNumber=0.314529e1

floatNumber: 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=true

x: Boolean = true

Scala基本类型操作

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

任何方法都可以是操作符

Scala里的操作符不是特殊的语法:任何方法都可以是操作符。到底是方法还是操作符取决于你如何使用它。

例如:

如果写成s.indexOf('0’),indexOf就不是操作符。

如果写成s indexOf '0'那么indexOf就是操作符,因为你以操作符标注方式使用它。

Scala中的3类操作符:

  • 中缀(infix)操作符(标注):操作符位于对象和传递给方法的参数或若干参数之间。例如:“7 + 2”。
  • 前缀操(prefix)作符(标注):方法名被放在调用的对象之前。例如:- 7 里的“-”。只有+、-、!和~。
  • 后缀(subfix)操作符(标注):方法放在对象之后。例如:“7 toLong”里的“toLong”。

与中缀操作符--两个操作数,分别再操作符的左右两侧,前缀和后缀操作符都是一元(unary)的:它们仅有一个操作数。前缀方式中,操作数在操作符右边。

算术操作:

//整数求和,编译器会将其转换为(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

关系运算:

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

//

scala> 1 & 2

res24: Int = 0

// 00000001

// 00000010

//

scala> 1 | 2

res24: Int = 3

// 00000001

// 00000011

//

scala> 1 ^ 3

res24: Int =2

//00000001

//

scala> ~1

res24: Int =-2

//左移位(shift left)

//00000110

//

scala> 6 << 1

res29: Int = 12

//右移位(shift left)

//00000110

//

scala> 6 >> 1

res28: Int = 3

//无符号右移(shift left)

//11111111111111111111111111111111

//

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

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

图片来源: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控制结构
//这me做可以减少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(".")).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 .\「开始」菜单

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

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

在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 基本类型和操作的更多相关文章

  1. Scala编程--基本类型和操作

    如果你熟悉Java,你会很开心地发现Java基本类型和操作符在Scala里有同样的意思.然而即使你是一位资深Java开发者,这里也仍然有一些有趣的差别使得本章值得一读.因为本章提到的一些Scala的方 ...

  2. Scala 编程(三)基本类型和操作

    一些基本类型 值类型 范围 Byte 8位有符号补码整数(-27-27-1) Short 16位有符号补码整数(-215-215-1) Int 32位有符号补码整数(-231-231-1) Long ...

  3. Scala学习笔记(八):基本类型和操作

    基本类型: 整数类型=>数类型 字面量:字面量就是直接写在代码里的常量值 字面量是指由字母.数字等构成的字符串或者数值,它只能作为右值出现,所谓右值是指等号右边的值,如:int a=123这里的 ...

  4. scala编程(五)——基本类型和操作

    文本 文本是直接在代码里写常量值的一种方式以.在Scala中并不显式的使用Int或float,而是以文本的方式写成 val 变量. 如果整数文本结束于 L 或者 l,就是 Long 类型,否则就是 I ...

  5. redis基本类型和操作

    基本类型:string hash list set sorted set 添加String 类型(最基本的key,value形式) set str1 s1 获取value get str1 添加has ...

  6. C/C++、C#、JAVA(二):基本类型和转换操作

    基本类型和转换操作 数据类型 C语言中的基本类型如下. 类型 存储大小 值范围 char 1 字节 -128 到 127 或 0 到 255 unsigned char 1 字节 0 到 255 si ...

  7. 【Java心得总结一】Java基本类型和包装类型解析

    说到数据类型这个问题是一个基本的不能再基本的问题,我们当初编程入门第一课一般就是讲数据类型,而今天我想记录的是一个在Java中容易忽略的问题,即基本类型和包装类型. 一.基本类型出现的原因 我们都知道 ...

  8. Java基础——基本类型和包装类、基本类型和字符串之间的转换

    基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更 ...

  9. Java基础(35):装箱与拆箱---Java 中基本类型和包装类之间的转换(Wrapper类)

    基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更加轻松便利了. 那什么是装箱 ...

随机推荐

  1. java-方法重写的注意事项

    1.父类中私有方法不能被重写.因为父类的私有方法子类根本就无法继承. 2.子类重写父类方法时,访问权限不能更低.最好就一致. 3.父类静态方法,子类也必须通过静态方法进行重写.其实这个算不上方法重写, ...

  2. C# 后台获取API接口数据

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  3. 【HDOJ2586】【Tarjan离线求LCA】

    http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) ...

  4. hdu2328 Corporate Identity 扩展KMP

    Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...

  5. MySQL之高可用MHA部署

    先说一下大概原理 虚拟机A  ip为10.0.3.92           作为master 虚拟机B  ip为10.0.3.102  作为slave1 虚拟机C  ip为10.0.3.103  作为 ...

  6. namespace关键字学习笔记

    一.namespace简介 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越 ...

  7. Atheros AR9285坑爹网卡仅仅有54M/65M,开启150M速率的方法

    版权声明:Max Sky 原创文章.转载时请保留全部权并以超链接形式标明文章出处.否则将追究相关法律责任. https://blog.csdn.net/maxsky/article/details/3 ...

  8. c#实现RGB字节数组生成图片

    我是要用c#来实现,现在已经知道了rgb数组,那么如何快速生成一张图片呢? 其实这个话题并不局限于是rgb字节数组的顺序,只要你能对于上表示红.绿.蓝的值,就可以生成图片.知道了原理,做什么都简单了. ...

  9. c# 数据类型可在在最后的带一个字母

    folat的后面要带F或者f: double的后面要带D或者d: decimal的后面要带M或者m: long的后面要带L或者l:

  10. 我发起了一个 .Net 平台上的 开源项目 知识图谱 Babana Map 和 文本文件搜索引擎 Babana Search

    起因 也是 前几天 有 网友 在 群 里发了   知识图谱   相关的文章, 还有 有 网友 问起   NLog -> LogStash -> Elastic Search  的 问题, ...