当前位置:   article > 正文

groovy操作符_groovy = 和==优先级

groovy = 和==优先级

目录

数学运算符

对象运算符

空对象安全引用运算符

直接字段访问操作符 

方法指针操作符

 正则表达式运算符

其他操作符

扩展操作符

解包方法参数、列表元素、键值对

范围操作符

比较操作符

索引操作符

成员操作符

== 和is操作符

类型转换操作符

钻石操作符

调用操作符

操作符优先级表

操作符重载



数学运算符

  1. #乘方
  2. assert 2 ** 3 == 8
  3. #非运算
  4. assert (!true) == false
  5. assert (!'foo') == false
  6. assert (!'') == true
  7. #三元表达式
  8. result = (string!=null && string.length()>0) ? 'Found' : 'Not found'
  9. result = string ? 'Found' : 'Not found'
  10. #艾维斯运算符
  11. displayName = user.name ? user.name : 'Anonymous'
  12. #进一步简写为:
  13. displayName = user.name ?: 'Anonymous'

对象运算符

空对象安全引用运算符

避免抛出NullPointerException 这个异常。

  1. def person = Person.find { it.id == 123 }
  2. def name = person?.name
  3. assert name == null

直接字段访问操作符 

接字段访问 .@ 可以跳过 getXXX 方法,直接获得字段的值

assert user.@name == 'Bob'

方法指针操作符

方法指针 (.&) 操作符可以获取一个方法指针,后面再调用这个指针

  1. def str = 'example of method reference'
  2. def fun = str.&toUpperCase
  3. def upper = fun()

方法指针获得的值是一个groovy.lang.Closure 类型,因此可以用到任何需要闭包的地方,非常适合策略模式

  1. def transform(List elements, Closure action) {
  2. def result = []
  3. elements.each {
  4. result << action(it)
  5. }
  6. result
  7. }
  8. String describe(Person p) {
  9. "$p.name is $p.age"
  10. }
  11. def action = this.&describe
  12. def list = [
  13. new Person(name: 'Bob', age: 42),
  14. new Person(name: 'Julia', age: 35)]
  15. assert transform(list, action) == ['Bob is 42', 'Julia is 35']

Groovy 允许重载多个同名方法,如果方法指针指向重载同名方法,则根据参数类型来判断调用哪个方法

  1. def doSomething(String str) { str.toUpperCase() }
  2. def doSomething(Integer x) { 2*x }
  3. def reference = this.&doSomething
  4. assert reference('foo') == 'FOO'
  5. assert reference(123) == 246

 正则表达式运算符

模式运算符、匹配对象操作符、直接匹配操作符

略。

其他操作符

扩展操作符

扩展操作符的本质是迭代调用并生成列表,因此任何实现了 Iterable 接口的对象都可以使用扩展操作符

  1. class Component {
  2. Long id
  3. String name
  4. }
  5. class CompositeObject implements Iterable<Component> {
  6. def components = [
  7. new Component(id: 1, name: 'Foo'),
  8. new Component(id: 2, name: 'Bar')]
  9. @Override
  10. Iterator<Component> iterator() {
  11. components.iterator()
  12. }
  13. }
  14. def composite = new CompositeObject()
  15. assert composite*.id == [1,2]
  16. assert composite*.name == ['Foo','Bar']

解包方法参数、列表元素、键值对

  1. 1.解包方法参数
  2. 下面这个方法需要三个参数
  3. int function(int x, int y, int z) {
  4. x*y+z
  5. }
  6. 下面这个列表有三个元素
  7. def args = [4,5,6]
  8. 将列表解包为三个参数传给方法
  9. assert function(*args) == 26
  10. 位置可以随意
  11. args = [4]
  12. assert function(*args,5,6) == 26
  13. 2.解包列表元素
  14. def items = [4,5]
  15. def list = [1,2,3,*items,6]
  16. assert list == [1,2,3,4,5,6]
  17. 3.解包键值对
  18. def m1 = [c:3, d:4]
  19. def map = [a:1, b:2, *:m1]
  20. assert map == [a:1, b:2, c:3, d:4]
  21. 如果出现重复的的键,后面的值将替换前面的值
  22. def m1 = [c:3, d:4]
  23. def map = [a:1, b:2, *:m1, d: 8]
  24. assert map == [a:1, b:2, c:3, d:8]

范围操作符

范围操作符 (..) 创建一个 groovy.lang.Range 对象,这个类型同时实现了 List 接口

  1. def range = 0..5
  2. assert (0..5).collect() == [0, 1, 2, 3, 4, 5]
  3. assert (0..<5).collect() == [0, 1, 2, 3, 4]
  4. assert (0..5) instanceof List
  5. assert (0..5).size() == 6

Range 对象是轻量级的,仅仅存储了上下边界,因此要创建 Range 还必须实现 Comparable 接口中的 next() 方法和 previous() 方法。因为字符对象实现了这两个方法,因此可以向下面这样用

assert('a'..'d').collect()==['a','b','c','d']

比较操作符

比较操作符 (<=>) 其实就是 compareTo 方法

  1. assert (1 <=> 1) == 0
  2. assert (1 <=> 2) == -1
  3. assert (2 <=> 1) == 1
  4. assert ('a' <=> 'z') == -1

索引操作符

索引操作符本质上是调用 getAtputAt 方法,可以切片获取或者切片赋值

  1. def list = [0,1,2,3,4]
  2. assert list[2] == 2
  3. list[2] = 4
  4. assert list[0..2] == [0,1,4]
  5. list[0..2] = [6,6,6]
  6. assert list == [6,6,6,3,4]

可以重写 getAt/putAt 方法,实现一些自定义的行为

  1. class User {
  2. Long id
  3. String name
  4. def getAt(int i) {
  5. switch (i) {
  6. case 0: return id
  7. case 1: return name
  8. }
  9. throw new IllegalArgumentException("No such element $i")
  10. }
  11. void putAt(int i, def value) {
  12. switch (i) {
  13. case 0: id = value; return
  14. case 1: name = value; return
  15. }
  16. throw new IllegalArgumentException("No such element $i")
  17. }
  18. }
  19. def user = new User(id: 1, name: 'Alex')
  20. assert user[0] == 1
  21. assert user[1] == 'Alex'
  22. user[1] = 'Bob'
  23. assert user.name == 'Bob'

成员操作符

成员操作符 (in) 相当于调用了列表的 contains 方法或者 isCase 方法

  1. def list = ['Grace','Rob','Emmy']
  2. assert ('Emmy' in list)

calling list.contains('Emmy')list.isCase('Emmy')是同样的功能

== 和is操作符

在 Groovy 中, == 仅仅检测值是否相同,如果想检测是否是同一个对象,使用 is 操作符

  1. def list1 = ['Groovy 1.8','Groovy 2.0','Groovy 2.3']
  2. def list2 = ['Groovy 1.8','Groovy 2.0','Groovy 2.3']
  3. assert list1 == list2
  4. assert !list1.is(list2)

类型转换操作符

  1. 转型操作符 (as) 可以转换一些不兼容变量的类型,例如下面的转换会抛出异常
  2. Integer x = 123
  3. String s = (String) x
  4. 用转型操作符可以正确转换
  5. Integer x = 123
  6. String s = x as String
  7. 转型的本质实际上是调用了对象的 asType 方法,可以重写这个方法实现一些自定义的行为
  8. class Identifiable {
  9. String name
  10. }
  11. class User {
  12. Long id
  13. String name
  14. def asType(Class target) {
  15. if (target==Identifiable) {
  16. return new Identifiable(name: name)
  17. }
  18. throw new ClassCastException("User cannot be coerced into $target")
  19. }
  20. }
  21. def u = new User(name: 'Xavier')
  22. def p = u as Identifiable
  23. assert p instanceof Identifiable
  24. assert !(p instanceof User)

钻石操作符

钻石操作符 (<>) 仅仅是为了兼容 Java 7 中的泛型,目前在 Groovy 中还没有什么用处。

List<String> strings = new LinkedList<>()

调用操作符

调用操作符 () 隐式调用 call 方法。可以重写 call 实现一些自定义的行为,然后用调用操作符调用

  1. class MyCallable {
  2. int call(int x) {
  3. 2*x
  4. }
  5. }
  6. def mc = new MyCallable()
  7. assert mc.call(2) == 4
  8. assert mc(2) == 4

操作符优先级表

略。参见:http://groovy-lang.org/operators.html#Operator%20precedence

操作符重载

类似于c++的操作符重载,Groovy 中的大部分操作符都可以重新定义,例如:

  1. class Bucket {
  2. int size
  3. Bucket(int size) { this.size = size }
  4. Bucket plus(Bucket other) {
  5. return new Bucket(this.size + other.size)
  6. }
  7. }
  8. #方法 plus() 重载了 + 操作符
  9. def b1 = new Bucket(4)
  10. def b2 = new Bucket(11)
  11. assert (b1 + b2).size == 15

下表是各个操作符的函数名称:

操作符方法操作符方法
+a.plus(b)a[b]a.getAt(b)
-a.minus(b)a[b] = ca.putAt(b, c)
*a.multiply(b)a in bb.isCase(a)
/a.div(b)<<a.leftShift(b)
%a.mod(b)>>a.rightShift(b)
**a.power(b)>>>a.rightShiftUnsigned(b)

|

a.or(b)

++

a.next()

&a.and(b)--a.previous()
^a.xor(b)+aa.positive()
asa.asType(b)-aa.negative()
a()a.call()~aa.bitwiseNegative()

笔记出处:https://www.jianshu.com/p/1339ab4f35dd

原文出处:http://groovy-lang.org/syntax.html

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号