groovy-运算符

简介:

算术和条件运算符

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() == [3, 8]

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

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


==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/p/3349048.html,如需转载请自行联系原作者
相关文章
|
Java Apache
阿里Java开发手册一方库/二方库/三方库等概念详解
阿里Java开发手册一方库/二方库/三方库等概念详解
3625 0
|
9月前
|
人工智能 运维 架构师
老金开源Agent Teams编排Skill:一句话自动组队,手动挡时代结束了
加我进AI讨论学习群,公众号右下角“联系方式” 文末有老金的 **开源知识库地址·全免费** --- 术语说明:"Swarm/蜂群"是多Agent协作的通用说法(OpenAI有官方项目叫Swarm),但 Claude Code的官方概念是Agent Teams。本文使用官方术语Agent Teams,保留"蜂群"作为通俗说明。 先说老金我昨儿开源了[老金开源10万字Claude Code中文
5708 10
老金开源Agent Teams编排Skill:一句话自动组队,手动挡时代结束了
|
Prometheus Kubernetes 监控
NVIDIA GPU Operator分析六:NVIDIA GPU Operator原理分析
背景我们知道,如果在Kubernetes中支持GPU设备调度,需要做如下的工作:节点上安装nvidia驱动节点上安装nvidia-docker集群部署gpu device plugin,用于为调度到该节点的pod分配GPU设备。除此之外,如果你需要监控集群GPU资源使用情况,你可能还需要安装DCCM exporter结合Prometheus输出GPU资源监控信息。要安装和管理这么多的组件,对于运维
3911 0
|
人工智能 运维 Cloud Native
实战基于阿里云的AIGC在运维领域的探索
传统运维模式已难以应对日益复杂的海量数据和业务需求,效率低下,故障难解。而人工智能的崛起,特别是AIGC技术的出现,为运维领域带来了新的机遇。AIGC能够自动生成运维脚本、分析海量数据,预测潜在故障,甚至提供解决方案,为运维工作注入智能化力量,推动运维向更高效、更智能的方向发展。
17592 19
实战基于阿里云的AIGC在运维领域的探索
|
API
如何制作外挂
一、先说一下写一个外挂需要什么条件 1、熟练的C语言知识 目前的外挂大部分都是用BC或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件 2、具有很强的汇编基础 一般游戏都不可能有原代码的,必须靠反汇编或者跟踪的办法来探索其中的机理 ,所以有强的汇编基础也是必不可少的条件 3、熟练掌握...
3799 0
|
Kubernetes 网络安全 容器
Cert Manager 申请 SSL 证书流程及相关概念 - 一
Cert Manager 申请 SSL 证书流程及相关概念 - 一
|
消息中间件 NoSQL 前端开发
通过WebSocket实现日志打印功能
通过WebSocket实现日志打印功能
1700 0
通过WebSocket实现日志打印功能
|
数据可视化 Java Go
Go性能分析工具的介绍与使用(2)
Go性能分析工具的介绍与使用(2)
717 0

热门文章

最新文章