算术和条件运算符

Groovy支”!”操作符,例如:

1 def expression = false
2 assert !expression

基于集合的运算符:

Spread Operator (*.)运算法:

spread操作符用来调用集合中的每一个对象的行为,就相当于调用collect方法一样:

1 parent*.action //equivalent to:
2 parent.collect{ child -> child?.action }

这个行为可能是一个方法调用或者属性访问,并返回一个列表。下面是一个例子:

1 assert ['cat''elephant']*.size() == [38]

我们也可以自定义这个运算符的行为:

1 class Person { String name }
2 class Twin {
3  Person one, two
4  def iterator() {
5  return [one, two].iterator()
6  }
7 }
8  
9 def tw = new Twin(one: new Person(name:'Tom'),
10  two: new Person(name:'Tim'))
11 assert tw*.name == ['Tom''Tim']
12 // expanded equivalent of above:
13 assert tw.collect{ it.name } == ['Tom''Tim']
Java field (.@):

Groovy自动的为所有的字段属性创建getter方法来返回字段属性的引用:

1 class X
2 {
3  def field
4 }
5  
6 x = new X()
7 x.field = 1
8 println x.field // 1

当然,你也可以根据自己的需求重载这个getter方法:

1 class X
2 {
3  def field
4  
5 def getField()
6  {
7  field += 1
8  }
9 }
10  
11 x = new X()
12 x.field = 1
13 println x.field // 2

@运算符容许你重载这个行为并且直接访问字段,所以我们可以将上面的代码扩展为:

1 println x.@field // 1

但是并不推荐这种方法。官方给我解释是:

It should be mentioned that, while interesting, this is probably not a good thing to do unless you really need to. Overriding a public interface to access the internal state of an object probably means you are about to break something. Not even recommended for use in tests since it increases coupling unnecessarily.

其他的操作符:

getAt(index)和putAt(index, value)对应于下标操作符,比如 foo[1] or foo['bar'],需要注意的是下标可以是int也可以是string。

Range操作符(..)类似于Python中的range函数,容许你创建一个序列。

isCase()操作符对应于in

Elvis Operator (?: )

这个操作符是java中三元操作符的另外一种形式,比如:

1 def displayName = user.name ? user.name : "Anonymous" //traditional ternary operator usage
2  
3 def displayName = user.name ?: "Anonymous" // more compact Elvis operator - does same as above

Safe Navigation Operator (?.)

好吧,我把它翻译为安全导航操作符,这个操作符主要是为了避免在你访问一个对象的属性或者方法的时候,出现 NullPointerException的问题。在java中当我们访问一个对象(这个对象值为null)的属性或者方法,会出现空指针异常,如果使用这个操作符,就不会出现空指针异常,而是会返回null。

1 def user = User.find"admin" //this might be null if 'admin' does not exist
2 def streetName = user?.address?.street //streetName will be null if user or user.address is null - no NPE thrown

正则表达式操作符

  • find (=~)
  • match (==~)
这两个操作符以后再说。
下面的表格列出了大量的操作符:

Operator Name

Symbol

Description

Spaceship

<=>

Useful in comparisons, returns -1 if left is smaller 0 if == to right or 1 if greater than the right

Regex find

=~

Find with a regular expresion? See Regular Expressions

Regex match

==~

Get a match via a regex? See Regular Expressions

Java Field Override

.@

Can be used to override generated properties to provide access to a field

Spread

*.

Used to invoke an action on all items of an aggregate object

Spread Java Field

*.@

Amalgamation of the above two

Method Reference

.&

Get a reference to a method, can be useful for creating closures from methods

asType Operator

as

Used for groovy casting, coercing one type to another.

Membership Operator

in

Can be used as replacement for collection.contains()

Identity Operator

is

Identity check. Since == is overridden in Groovy with the meaning of equality we need some fallback to check for object identity.

Safe Navigation

?.

returns nulls instead of throwing NullPointerExceptions

Elvis Operator

?:

Shorter ternary operator

groovy-运算符的更多相关文章

  1. groovy运算符

    import java.util.regex.Matcher /** * Created by Jxy on 2018/12/20 10:29 * groovy运算符 */ /*class opera ...

  2. 【Groovy基础系列】 Groovy运算符

    ?运算符 在java中,有时候为了避免出现空指针异常,我们通常需要这样的技巧: if(rs!=null){ rs.next() … … } 在groovy中,可以使用?操作符达到同样的目的: rs?. ...

  3. groovy–运算符重载

    Groovy支持运算符重载,各种运算符被映射到普通的java对象的方法调用,这就使得开发者可以利用运算符重载的优势来编写自己的Java或者groovy对象. 下面的表格描述了groovy中的操作符所映 ...

  4. Groovy基本类型与运算符

    字符串 1.1字符串段落 def s = """Groovy Grails JAVA """ 输出结果: Groovy Grails JAV ...

  5. 看懂Gradle脚本(4)- Groovy语法之运算符重载

    继续讨论Task定义 回想一下前一篇文章的样例: task myTask { doLast { println 'hello world!' } } 这段脚本定义了一个名为myTask的任务.而且通过 ...

  6. groovy实现循环、交换变量、多赋值、?.运算符

    /** * Created by Jxy on 2019/1/3 10:01 * 1.实现循环的方式 * 2.安全导航操作符---?. * 3.一次性赋值给多个变量 */ 0.upto(2){ pri ...

  7. Groovy入门经典 随书重点

    1 数值和表达式 1.1数值 整数是Integer类的实例 有小数部分的数值是BigDecimal类的实例 不同于java,没有基础数据类型 一切皆对象的概念重于java 1.2表达式 两个整数的除法 ...

  8. Groovy入门教程

    Groovy入门教程 kmyhy@126.com  2009-5-13 一.groovy是什么 简单地说,Groovy 是下一代的java语言,跟java一样,它也运行在 JVM 中. 作为跑在JVM ...

  9. atitit groovy 总结java 提升效率

    atitit groovy 总结java 提升效率 #---环境配置 1 #------安装麻烦的 2 三.创建groovy项目 2 3.  添加 Groovy 类 2 4.  编译运行groovy类 ...

  10. Groovy新手教程

    Groovy新手教程 kmyhy@126.com  2009-5-13 一.groovy是什么 简单地说,Groovy 是下一代的java语言,跟java一样,它也执行在 JVM 中. 作为跑在JVM ...

随机推荐

  1. [转] Android实时抓包分析 : 善用adb调试桥

    Android实时抓包分析 : 善用adb调试桥   谈到android网络抓包,很多人都能想到牛逼轰轰的神器tcpdump.方法就是在android机器上面安装tcpdump,然后通过-w参数把抓包 ...

  2. 纯CSS3制作九款可爱复古相机

    前言 掐指一算,快两个月没写博客分享了.好吧,我就只是在准备校招而已.现在已经有满意的offer了,所以我就回来啦!这两个月过得挺煎熬也挺充实的.具体细说估计得长篇大论,我就不闲扯了.总之呢,越努力, ...

  3. 25Spring_事务管理的两种机制

    一共有两种事务管理机制:编程式事务管理和声明式事务管理. 1.编程式事务管理企业已经不用了. 2.我们主要讲的是声明式事务管理.声明式事务管理 ,无需要修改原来代码,只需要配置,为目标代码添加事务管理 ...

  4. [转]iOS 应用内付费(IAP)开发步骤

    FROM : http://blog.csdn.net/xiaoxiangzhu660810/article/details/17434907 参考文章链接: (1)http://mobile.51c ...

  5. [教程]Oracle 11g Express 安装和使用教程

    使用工具的第一步就是安装工具,配置环境!下面就Oracle 11g Express的安装和简单实用做一简介. 一.下载安装过程 去oracle的官网下载Oracle 11g express,大概300 ...

  6. 事务的四个特性-ACID

    事务是恢复和并发控制的基本单位.   事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性.   原子性(atomicity):一个事务是一个不可分割的工作单位,事务中 ...

  7. (转载)关于Apache 的两种工作模式

    今天在查看服务器的时候,发现服务器http请求数 每天增长越来越多,在优化集群服务器的时候,查看到Apache 的工作模式是prefork,于是想到了worker 模式, 想暂时的把当前运行模式改成w ...

  8. IIS增加并发数

    网站出现这样的错误信息:Error Summary: HTTP Error 503.2 - Service UnavailableThe serverRuntime@appConcurrentRequ ...

  9. GEOS库的学习之一:介绍和编译

    对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...

  10. WebSocket使用教程 2

    WebSocket使用教程 - 带完整实例 收藏 james_laughing 发表于 2年前 阅读 46438 收藏 23 点赞 5 评论 4 摘要: WebSocket使用教程 - 带完整实例 什 ...