掌握Scala运算符1.4

1.运算符等价于方法

1.1运算符即方法

op运算符与.op方法调用是等价的,op表示运算符:+-*/……

演示x + yx.+(y)的等价性

掌握Scala运算符1.4_第1张图片

1.2方法即运算符 

1.2.1单参方法

val str = "international"
val x1 = str.indexOf('a')
val x2 = str indexOf 'a'

str.indexOf('a')  str indexOf 'a' 是等价的

掌握Scala运算符1.4_第2张图片

1.2.2 多参方法

val str = "international"
val x1 = str.substring(2,4)
val x2 = str substring (2,4)

str.substring(2, 4) str substring (2, 4)是等价的

掌握Scala运算符1.4_第3张图片

1.2.3无参方法

val str = "international"
val x = str.toUpperCase()
val y = str.toUpperCase  //方法调用时,没有参数,括号可以省略
val z = str toUpperCase  //这种方法,没有参数可以不写括号

注意:使用后缀运算符toUpperCase之前必须导入scala.language.postfixOps类,否则会报错

掌握Scala运算符1.4_第4张图片

import scala.language.postfixOps
val str = "international"
val x = str.toUpperCase()
val y = str.toUpperCase  //方法调用时,没有参数,括号可以省略
val z = str toUpperCase  //这种方法,没有参数可以不写括号

 掌握Scala运算符1.4_第5张图片

2.Scala运算符

2.1运算符分类表

掌握Scala运算符1.4_第6张图片

2.2Scala与Java运算符比较 

Scala和Java运算符基本相同,不同之处在于比较运算符。

Java中,如果是基本数据类型,==!=比较的是值;如果是复杂数据类型,比较的是对象的地址,如果不是想比较地址而是想比较真正的内容,则需要使用equals方法

掌握Scala运算符1.4_第7张图片

Scala中,如果是基本数据类型,==!=比较的是值;如果是复杂数据类型,会隐含地调用equals进行比较,这也就意味着 Scala中不存在Java中经典的equals问题。

val a = 100
val b = a + 0
a == b
val str = "scala"
val str1 = str + ""
str == str1
str.equals(str1)

掌握Scala运算符1.4_第8张图片

 3.运算符种类

3.1中缀运算符(Infix Operator)

 运算符符在两个操作数之间,2 + 3 等同于2.+(3)

掌握Scala运算符1.4_第9张图片

3.2前缀运算符(Prefix Operator) 

运算符在唯一的操作数之前 :-1、+3、 ~0xFF、!false

-1等同于1.unary_-,前缀运算符如同中缀运算符一样,也是方法调用的另一种方式,不同的是,方法名要在符号前加上前缀unary_ 

掌握Scala运算符1.4_第10张图片

能作为前缀运算符的运算符只有+、-、!、~四种。如果你自己定义了unary_!方法就可以使用!前缀运算符来调用方法了,但是即使你定义了unary_**也不能用来调用该方法,因为*不是四种可用的前缀运算符之一 

掌握Scala运算符1.4_第11张图片

3.3 后缀运算符(Postfix Operator)

运算符在唯一的操作数之后str toUpperCase 等同于str.toUpperCase(),后缀运算符不用点或括号调用无参方法。在Scala里,方法调用的空括号可以省略,但是如果去掉括号可能造成副作用就带上括号。

掌握Scala运算符1.4_第12张图片

4.运算优先级

4.1简单说明

由于Scala并没有真正的运算符,运算符其实是方法的一种形式,所以此处运算符的优先级,其实就是指方法的优先级。在Scala中方法的执行是有优先级的区别的,这也是为了解决传统运算符优先级问题。

例如:3 + 2 * 5,我们期望获得的是13,但是根据Scala特点,Scala中所有运算符其实就是方法,那么按照这种说法,表达式应该等同于(3).+(2) 得到5(5).*(5) 得到25,与我们的预期不符!Scala如何解决此问题呢?靠的是运算符优先级。

掌握Scala运算符1.4_第13张图片

4.2运算优先级表 

具有最高优先级的运算符在表的顶部,那些优先低级排在底部。在一个表达式,优先级高的运算符将首先计算

掌握Scala运算符1.4_第14张图片 

如果运算符以=结尾,且运算符并非比较运算符 <=>====,则运算符优先级等同于=,即优先级最低,例如+=-=等;同级别优先级从左到右统计;可以使用括号改变优先级,这是个好习惯,特别是在Scala这种可能过于简洁的语言中。

 特殊情况:以:字符结尾的方法由它的右操作数调用,并传入左操作数,以其它字符结尾的方法与之相反。a :: b 对应的是 (b).::(a) 而不是 (a).::(b)

你可能感兴趣的:(java,开发语言)