Scala编程(第五章:基础类型和操作)

本文介绍了Scala的基础类型,包括整数、数值等类型,以及各类型的字面量表示。还阐述了字符串插值、操作符即方法的概念,涵盖算术、关系、逻辑、位运算等操作,对比了Scala和Java对象相等性判断的差异,提及操作符优先级和富包装类等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.一些基础类型:String,Int,Long,Short,Byte,Float,Double,Char和Boolean.

整数类型(integral type):Byte,Short,Long,Int和Char

数值类型(numeric type):Float和Double

除了位于java.lang的String,其它的类型都是scala包的成员。例如,Int的完整名称是scala.Int。Scala的基础类型跟Java中对应的类型取值区间完全相同。

 

2.字面量:Scala不支持八进制字面量和以)开头的整数字面量,如031,编译将无法通过。

整数字面量

如果是以0x或0X开头,意味这是十六进制的数,包含0-9,以及大写或小写的A-F。如,0x00FF,打印出来为255。

注意:Scala总是以十进制打印整数值。

如果整数字面量以L或l(小写L)结尾,那么它就是Long型的,否则就是Int。如,0xFFL,打印255.

如果Int型字面量被赋值给Short或Byte变量,该字面量会被当作Short或Byte类型,只要这个字面量的值在对应类型的合法区间内。如:

scala> val little:Short=367
little:Short=367
scala> val littler:Byte=38
littler:Byte=38

浮点数字面量:

浮点数字面量由十进制的数字、可选的小数点,以及后续一个可选的E或e打头的指数组成,如:1.2345,1.2345e1,123E5,打印分别为:1.2345,12.345,1.23E7。

如果浮点数以f或F结尾,那它就是Float型的;否则它就是Double。Double可以以D或d结尾,但这是可选的。

字符字面量

字符字面量由一对单引号和中间的任意Unicode字符组成,如:

scala> val a = 'A'
a: Char = A

除了显式地给出原字符,也可以用字符的Unicode码来表示,具体写法是\u加上Unicode码对应的四位的十六进制的数字,如:

scala> val d = '\u0041'
d: Char = A
scala> val f = '\u0044'
f: Char = D

事实上,这样的Unicode字符可以出现在Scala程序的任何位置。如,可以这样命名一个标识符(变量):

scala> val B\u0041\u0044 = 1
BAD: Int = 1

还有一些字符字面量是由特殊的转义序列来表示的,如:

scala> val backslash = '\\'
backslash: Char = \

还有换行,退格,制表符等。

字符串字面量:可以用三个双引号(""")开始并以三个双引号(""")结束来表示原生字符串,内部可以包括任何字符,包括换行,单双引号和其它特殊字符。当然,连续三个双引号的情况除外。

符号字面量(symbol literal):写法是'ident,其中ident可以是任何由字母和数字组成的标识符。会被映射成scala.Symbol这个预定义类的实例,如:Symbol(“”cymbal“”)。

布尔字面量:类型Boolean有两个字面量,true和flase。

 

3.字符串插值

直接来看代码:

val name="reader"
println(s"Hello,$name!")
//结果为:Hello,reader!
scala> s"The answer is ${6*7}."
res0: String = The answer is 42.

Scala将使用s这个插值器来处理该字面量。Scala默认还提供了另外两种字符串插值器:raw和f。raw字符串插值器的行为跟s类似,不过它并不识别字符转义序列。如:

println(raw"No\\\n\tescape!")//打印出:No\\\n\tescape!

f字符串插值器允许你给内嵌的表达式加上printf风格的指令。需要将指令放在表达式之后,以百分号(%)开始。如,可以这样来格式化π:

scala> f"${math.Pi}%.5f"
res1:String = 3.14159

字符串插值器其含义是用toString的值来替换。

 

4.操作符即方法:操作符实际上只是普通方法调用的漂亮语法。

如,1+2实际上跟1.+(2)是一回事:

scala> val sumMore=1.+(2)
sumMore: Int = 3

任何方法都可以是操作符,因为用的是操作符表示法:

scala> val s ="Hello,World!"
s: String = Hello,world!
scala> s indexOf 'o'
res0: Int = 4
scala> s indexOf ('o',5)//Scala将调用s.indexOf('o',5)
res1:Int = 8

     上面是中缀操作符表示法的若干示例,中缀表示法意味着被调用的方法名位于对象和你想传入的参数中间,比如“7 + 2”。Scala还提供了另外两种操作符表示法:前缀和后缀。前缀表示法需要将方法名放在你要调用的方法的对象前面(比如“-7”中的“-”,~0xFF等)。后缀表示法需要将方法名放在对象之后(比如“7 toLong” 中的 “Long”)。

      跟中缀操作符相同,前缀操作符表示法也是调用方法的简写。不同的是,方法名称是“unary_”加上操作符(比如“-7”为“(7.unary_-)”)。唯一能用作前缀操作符的是+、-、!和~。

 

5.算术操作:加法(+)、减法(-)、乘法(*)、除法(/)和取余数(%)的中缀操作符表示法对任何数值类型调用算术方法。

你从浮点数的%得到的余数跟IEEE 754标准定义的不同。IEEE 754的余数在计算时用的是四舍五入,而不是截断,因此跟整数的余数操作很不一样。如果确实需要IEEE 754的余数,可以调用scala.math的IEEEremainder,比如:

scala> math.IEEEremainder(11.0,4.0)
res14: Double = -1.0

 

6.关系和逻辑操作:可以用关系方法大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)来比较数值类型的大小,返回Boolean的结果。除此之外,可以用一元的'!'操作符(方法unary_!)来对Boolean值取反。

逻辑方法:逻辑与(&&和&)和逻辑或(||和|),以中缀表示法接收Boolean的操作元,交出Boolean的结果。&&和||跟Java一样是短路的,从这两个操作符构建出来的表达式,只会对对结果有决定作用的部分进行求值。如&&表达式的左侧求值得到false,整个表达式的结果只能是false,因此右侧不会被求值。同理,如果||表达式的左侧求值得到true,那么整个表达式的结果只能是true,因此右侧也不会被求值。如:

def slat={println("slat");false}
def pepper={println("pepper");true}
println(slat&&pepper)
println()
println(pepper&&slat)
println()
println(pepper||slat)

//打印:
//slat
//false
//
//pepper
//slat
//false
//
//pepper
//true

注意:如何做到短路的?答案是所有Scala方法都有一个机制来延迟对入参的求值,或者干脆不对他们求值。这个机制叫作传名参数。

 

7.位运算操作:位运算方法有:按位与(&)、按位或(|)和按位异或(^,相同位交出0,不同位交出1)。一元的位补码操作(~,unary_~方法)对操作元的每一位取反。

Scala整数类型还提供了三个位移方法,左移(<<)、右移(>>)和无符号右移(>>>),当位移方法被用在中缀操作符表示法时,会将左侧的整数值移动右侧整数值的量。左移和无符号右移会自动填充0,而右移会用左侧值的最高位(符号位)来填充。如:

scala> -10>>2
res28: Int =-3
scala> -10>>>2
res29: Int =1073741821
scala> -2<<2
res30: Int =-8

 

8.对象相等性:如果你想要比较两个对象是否相等,可以用==或与之相反的!=。可以比较List等。如:

scala> List(1,2,3)==List(1,2,3)
res34: Boolean = true

逻辑很简单,首先检查左侧是否为null,如果不为null,调用equals方法。

Scala的==跟Java的不同:在Java中,可以用==来比较基本类型和引用类型。对基本类型而言,Java比较的是值的 相等性,就跟Scala一样。但是对于引用类型,Java的==比较的是引用相等性,意思是两个变量指向JVM的堆上的同一对象。Scala也提供了用于比较引用相等性的机制,即名为eq的方法。不过,eq和跟它对应的ne只对那些直接映射到Java对象的对象有效。

 

9.操作符优先级和结合性

方法首字符的优先级顺序,依次递减:(所有其他特殊字符)、*/%、+-、:、=!、<>、&、^、|、(所有字符)、(所有赋值操作符)。不喜欢记优先可以直接用()括起来。

 

10.富包装类:本章提到的每个基础类型,都有一个对应的“富包装类”,提供了额外的方法。

基础类型对应的“富包装类”分别为:scala.runtime.RichByte、scala.runtime.RichShort、scala.runtime.RichInt、scala.runtime.RichLong、scala.runtime.RichChar、scala.runtime.RichFloat、scala.runtime.RichDouble、scala.runtime.RichBoolean、scala.collection.immutable.StringOps

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值