6. Groovy 运算符-算术运算符,关系运算符和逻辑运算符学习

2022-12-07 18:23:16 浏览数 (1)

1. 前言

本篇是Groovy学习第6篇内容。前面学习了Groovy的语法,现在学习相关运算符知识。

内容比较多,将会分为多篇进行分享。让我们先从最基础的开始吧。

def 关键字,代表动态变量。可以理解为java中的object对象。

2. 算术运算符-Arithmetic operators

Groovy支持编程语言中常见的算术运算符。支持所有Java算术运算符。

例如普通的 -*/ 运算。

  • 加法运算:addition 标识符为:
  • 减法运算:subtraction 标识符为:-
  • 乘法运算:multiplication 标识符为:*
  • 除法运算:division 标识符为:/
  • 取余运算:remainder 标识符为:%
  • 幂运算:power 标识符为:**

常见示例如下所示:

代码语言:javascript复制
def ad =  1    2  //结果为3
def sub = 4  - 3  //结果为1
def mult =  3  * 5 //结果值为 15
def divi =  3  / 2 //结果值为 1.5
def rema =  10  % 3 //结果值为 1
def powe =   2 ** 3  //结果值为 8

其中加减乘除比价好理解。就是后面的取余计算和幂运算需要简单介绍一下。

取余计算,就是将除法除不尽的余数进行返回,该返回值永远大于等于0。例如上面示例中10/3 最多取3,余剩下的1无法被除尽。所以结果为1。

幂运算,例如上面的示例就是2^3^ 。右边跟着的值是幂值。计算结果就是:2*2*2所以结果值为8了。

2.1 一元运算符

在Groovy中, - 算为一元运算符。我们常见的使用方法为: (增量)和--(减量)运算符。同时能够将它和其他运算符混合使用。

示例效果如下所示:

代码语言:javascript复制
def a = 2
def b = a   * 3
println(b)  //输出的结果是6
println(a) //输出的结果是3
b =   a * 3
println(b)  //输出的结果是12

减法也可以按照这种逻辑进行计算。

代码语言:javascript复制
def c = 3
def d = c-- * 2
println(d)  //输出结果为6
println(c)  //输出结果为2

这其中有个前 和后 之间的区别。这个差异和java中的是一样的。

前 例如, a 就代表先对a做 1操作,然后再将a的结果值用于后面的计算。

后 例如,a 就代表先返回a,将a用于表达式中的计算,然后再对a做 1操作。

--运算符的前后差异也是这样的规则,只是它执行的是a-1操作而已。

那么我们如果是在加法运算中, 是会先执行还是后执行呢?示例如下:

代码语言:javascript复制
//前  
def e = 1
def f =   e   3
println(e)  //输出2
println(f)  //输出5
//后  
e = 1
f = e     3
println(e)  //输出2
println(f)  //输出4

可以看到, 的运算优先级最高。会先执行然后再执行其他的运算。

2.2 赋值算术运算符

上面的一元运算符中的 和-- 起始也算是赋值运算符的一种。因为它计算之后的结果是赋值给了源数据。

但是由于 和--是固定每次只会 1或者-1。我们如果想加更多或者减更多,也有简单的运算符进行操作:

  • = :加运算赋值。 ( 就是这个运算符 a =1 的更简写法)
  • -= :减运算赋值。 (-- 就是这个运算符 a-=1 的更简写法)
  • *= :乘法运算赋值。
  • /= :除法运算赋值。
  • %= :取余运算赋值。
  • **= :幂运算赋值。

效果示例如下:

代码语言:javascript复制
def a = 4
a  = 3
println(a) //输出 7

def b = 5
b -= 3
println(b) //输出 2

def c = 5
c *= 3
println(c) //输出 15

def d = 10
d /= 2
println(d) //输出 5

def e = 10
e %= 3
println(e) //输出 1


def f = 3
f **= 2
println(f) //输出 9

这些赋值运算只是一个方便我们节省代码的写法。如果你不喜欢也可以单纯使用算术运算符拼接进行书写。

如果表达式中加减乘除都拥有,那么计算顺序和数学中的公式计算是一样的优先级,从左往右先乘除后加减进行。

3. 关系运算符-Relational ioerators

关系运算符允许在对象之间进行比较,以了解两个对象是相同还是不同,或者一个大于、小于或等于另一个。

运算符

用途

==

等于比较,左右两边进行比较相等返回true,不等返回false。

!=

不等于比较,比较左右两边否不相等。不相等返回true,相等返回false。

<

小于比较,左边小于右边返回true,大于等于右边返回false。

<=

小于等于比较,左边小于或者等于右边返回true,否则返回false。

>

大于比较,左边大于右边返回true,小于或等于右边返回false。

>=

大于等于比较,左边大于或者等于右边返回true,否则返回false。

===

相同比较,左右两边相同返回true,不同返回false(版本Groovy 3.0.0才开始支持)

!==

不相同比较, 左右两边不相同返回true,相同返回false(版本Groovy 3.0.0才开始支持)

下面进行简单的代码示例展示:

代码语言:javascript复制
println(1   2==3)  //返回true
println(3 != 4) //返回 true
println(-2 < 3)  //返回true
println(2 <= 2)  //返回true
println(3 <= 4)  //返回true
println(5 > 1)   //返回true
println(5 >= -2)  //返回true

==是使用equals()进行的比较,而=== 使用的是is()进行的比较判断。 该运算符需要Groovy 3.0 SDK支持否则会出现错误。

代码语言:javascript复制
@EqualsAndHashCode
class Zinyan {
   String type
    def static main(def args) {
        def zin = new Zinyan(type: 'zinyan')
        def yan = new Zinyan(type: 'zinyan')
        //比较zin 和yan 两个值是相同的 。因为我自定的类添加了EqualsAndHashCode 比较参数的HashCode值
        println(zin.equals(yan)) //返回 true
        println(zin == yan)      //返回 true

        //我们如果直接进行相同判断
        println(zin === yan)   //返回false  因为这两个对象不同(内存空间地址不同)
        
        def copyZin = zin  //当我们直接复制
        println(zin.is(copyZin))  //返回结果为true。相同了
        println(zin === copyZin) //返回结果true。
    }
}

PS: 如果你的编译运行中有is方法,而没有===方法那说明你的groovy SDK版本 比较低了。

4. 逻辑运算符-Logical operators

Groovy为布尔表达式提供了三个逻辑运算符:

  • &&: 逻辑与,参照单词中的"and"
  • ||: 逻辑或,参照单词中的"or"
  • !: 逻辑非,参照单词中的"not"

示例说明如下:

代码语言:javascript复制
def a = false
def b = true
println( !a ) //返回结果true。
println( !b ) //返回结果false。
println( a && b ) //返回结果为false。
println( a || b ) //返回结果为true。

逻辑很简单,我就不做详细介绍了。所有编程语言中的逻辑运算符都是一样的。

我们要注意的地方在于,相同表达式中逻辑非!的运算优先级要高于逻辑与&&。例如:

代码语言:javascript复制
println(!false && false)  //返回的结果为false。 因为先进行了非运算。

而相同情况时,逻辑与&&是要高于逻辑或||的优先级的。示例如下:

代码语言:javascript复制
println(true || true && false ) //返回结果为true,因为先进行了与运算。

逻辑||运算符支持短路:如果左操作数为真,则它知道结果在任何情况下都为真,因此不会计算右操作数。仅当左操作数为假时,才会计算右操作数。

同样对于逻辑&&运算符:如果左操作数为假,则它知道结果在任何情况下都将为假,因此不会计算右操作数。仅当左操作数为真时,才会计算右操作数。

这种处理逻辑叫做短路Short-circuiting。

5. 小结

本篇内容到这里就结束了,相关资料可以通过Groovy官网文档进行了解:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#groovy-operators

本篇内容是我学习官网文档的一些笔记内容。

介绍了基础的算术运算,关系运算和逻辑运算。下一篇将会继续分享运算符知识,例如位运算,条件运算,对象运算符等等。

0 人点赞