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. 配置url防盗链、目录权限访问控制Directory、文件访问权限控制FilesMatch

    1.配置url防盗链: 编辑:/usr/local/apache2.4/conf/extra/httpd-vhosts 文件 写入: <Directory /var/www/222/>Se ...

  2. 2018.4.23 深入理解java虚拟机(转)

    深入理解java虚拟机 精华总结(面试) 一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个 ...

  3. CentOS7源码安装qbittorrent最新版本

    CentOS的软件 yum 里 yum search qbittorrent yum info qbittorrent 找到的是3.37版本 官网最新的是4.12版本.但需要源码安装: 官网下载最新版 ...

  4. ubuntu shell插件

    1. NetSpeed 在状态栏显示当前网速 2. Screenshot Tool 同样在 Ubuntu 18.04 之前我们使用 Shutter,但在Ubuntu 18.04 Shutter的托盘图 ...

  5. 《DSP using MATLAB》Problem 6.24

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  6. python 面向对象(类的成员,属性,绑定和非绑定,)

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

  7. hdu4549 M斐波那契数列 矩阵快速幂+快速幂

    M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的 ...

  8. 下面的程序段创建了BufferedReader类的对象in,以便读取本机c盘my文件夹下的文件1.txt。File构造函数中正确的路径和文件名的表示是( )。

    下面的程序段创建了BufferedReader类的对象in,以便读取本机c盘my文件夹下的文件1.txt.File构造函数中正确的路径和文件名的表示是(    ). ./表示当前项目的路径../表示当 ...

  9. 【shell编程】之基础知识-基本运算符

    Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 ...

  10. springboot收藏的博客

    1.纯洁的微笑:http://www.ityouknow.com/ 2.嘟嘟独立博客:http://tengj.top/ 3.http://blog.didispace.com/