文档章节

Groovy阅读小注

遥借东风
 遥借东风
发布于 2016/02/23 00:11
字数 979
阅读 25
收藏 1

1. 安全导航操作符 ?.,只有对象引用不为空时才会分派调用。

def a
a?.isEmpty()


2. groovy不强迫捕获我们不关心的异常。

捕获所有Exception 

try{
}catch(ex){
}


3. groovy默认都是public的。


4. groovy默认提供构造器。

class Robot{
    def type, height, width
} 
robot = new Robot(type: 'arm', width: 10, height: 40)


5. groovy传参

出现键值对的形式,groovy会将所有键值对作为第一个形参(Map)的Entry,其余参数按顺序赋给剩余形参。

class Robot{
    def access(location, weight, fragile){
        print "$fragile, $weight, $location"
    }
}
robot.access(x: 30, y: 20, z:10, 5, true)
//可改变顺序
robot.access(5, true, x: 30, y: 20, z:10)

注意:使用键值对传参,最好是当参数仅有一个Map时使用;

如果一定要使用一个Map + 多个参数传递的形式,请显示声明Map类型。

class Robot{
    def access(Map location, weight, fragile){
        print "$fragile, $weight, $location"
    }
}

当实参包含的不是两个对象和一个任意键值对,代码就会报错。


6. 可选形参, 方法可以不用再写重载

def log(x, base = 10){
    Math.log(x) / Math.log(base)
}


6.1 变长传参

最后一位形参是数组形式

def receiveVarArgs(int a, int... b){}
def receiveVarArg(int a, int[] b){}

注意:Groovy将 [2, 3]看作是ArrayList的一个实例对象,因此调用时:

receiveVarArgs(1, [2, 3, 4] as int[])


可参考Groovy创建数组、列表的区别:

int[] arr = [1, 2, 3]
def arr1 = [1, 2, 3] as int[]
def arr2 = [1, 2, 3] //ArrayList类型


7. 多赋值。返回数组,被多赋值给各个变量。

等号左边变量多的,将设为null(不能默认null的,抛异常),右边值多的,将丢弃。

def splitName(fullName){
fullName.split(' ')
}
def (firstName, lastName) = splitName('James Bond')


因此可以延伸为交换变量

def a = 1
def b = 2
(a, b) = [b, a]


8. 实现接口

一接口,单方法

def diaplyMouseLocation = {positionLabel.setText("$it.x, $it.y")}
frame.addMouseListener(diaplyMouseLocation as MouseListener)


一接口,多方法

def handleFocus = [
    focusGained : {}
    focusLost : {}
]


动态实现接口, asType()作为什么的接口实现

events = ['WindowListener', 'ComponentListener']//可以是更动态的一些输入
handler = {msgLabel.setText("$it")}
for(event in events){
    handlerImpl = handler.asType(Class.forName("java.awt.event.${event}"))
    frame."add${event}"(handlerImpl)
}


9. 默认布尔处理

groovy基本都为对象,除引用对象不为空为true外,有些对象还有如下情况也为true。

Boolean 值为true
Collection 不为空
Map 映射不为空
Char 不为0
字符串 长度大于0
数字 不为0
数组 长度大于0
其他类型 不为null
自定制 通过asBoolean()方法来重写


10. forEach

for(String greet : greetings){}
for(def greet : greetings){}

不想指定类型:

for(greet in greetings){}

或者 内部迭代器 each()


10. 静态导入支持别名

import static Math.random as rand
double value = rand()


11. java的编译时注解被忽略,如Override。

12. groovy既支持动态类型,又支持泛型。泛型在执行时进行检查生效。

13. Groovy可以重载操作符,因为每个操作符都被映射到一个标准的方法。

14. 使用注解生成代码

@Canonical 标注于类上,用于生成toString():逗号分隔各属性,可排除属性

@Canonical(excludes='lastName, age')
class Person{}


@Delegate 用于引入被委托类相应的方法包装器,用于委派任务。引入的具体实例方法与顺序有关。

查找还未有的方法进行一次引入。

class Worker{
    def work(){}
    def analyze(){}
}
class Expert{
    def analyze(){}
}
class Manager{
    @Delegate Expert expert = new Expert()//引入Expert实例的analyze方法
    @Delegate Worker worker = new Worker()//引入Worker实例的work方法
}


@Immutable 标注在类上,用于便捷生成不可变值对象,即属性final。同时提供hashCode()、equals()、toString()方法。

@Immutable
class CreditCard{
    String cardNumber
    int creditLimit
}


@Lazy 标注于属性上,懒加载

class Heavy{}
class AsNeeded {
    @Lazy Heavy heavy = new Heavy()
}


@Singleton 标注于类上,实现单例模式

@Singleton(lazy = true)
class TheUnique{
}


15. == 

== 等于调用java的equals(),除非实现Comparable接口的类型,== 等于compareTo()

is()等于java的==


16. groovy匿名内部类使用可能会有问题,会将{……}实现体当做闭包。

© 著作权归作者所有

上一篇: JAVA S3 Example
下一篇: (二)UIMA CPE
遥借东风
粉丝 1
博文 34
码字总数 24176
作品 0
武汉
高级程序员
私信 提问
groovy学习资料收藏

groovy学习资料收藏 Xstream Deserializable Vulnerablity And Groovy(CVE-2015-3253) Apache Groovy 2.4.6 发布 Groovy阅读小注 使用Groovy语言替代JUnit为Java程序编写单元测试 使用Gro...

d_watson
2016/03/16
80
0
CSDN日报20170727——《想提高团队技术,来试试这个套路!》

程序人生 | 想提高团队技术,来试试这个套路! 作者:劼哥stone 我加入阿里影业 3 个月,成功转为正式员工。新的开始,leader 给我新的要求,让我给组里的同学们带带节奏,帮助大家提高技术水...

blogdevteam
2017/07/27
0
0
使用 yaml+groovy 实现 Java 代码可配置化

使用 yaml+groovy 实现 Java 代码可配置化 ImportNew2018-01-061 阅读 Groovyyaml 原文出处: 琴水玉 背景与目标 在 使用函数接口和枚举实现配置式编程(Java与Scala实现) ,使用了函数接口和...

ImportNew
2018/01/06
0
0
Groovy 即将加入 Apache 软件基金会

Groovy 项目负责人 Guillaume Laforge 于近日宣布 Groovy 将加入 Apache Software Foundation。 如果该提案被接受,Apache PMCs,负责管理 groovy 项目 更多内容请看这里:http://jaxenter...

s3051024
2015/03/09
3.9K
18
Apache Groovy 2.4.14 发布,JVM 动态脚本语言

Apache Groovy 2.4.14 已发布,这是 GROOVY_2_4_X 分支的常规维护版本,强烈鼓励所有使用此分支旧版本的用户进行升级。 此次更新包括了 13 处的 bug 修复以及改进: Bug [GROOVY-6888] - St...

王练
2018/03/02
861
1

没有更多内容

加载失败,请刷新页面

加载更多

两数的最大公约数

hello,复习一下数学知识! 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。 因为之前做一个小功能,需要先计算一下数组的最大公约数,所以我就想记录一下...

woshixin
今天
3
0
学习Node.js的电子书大全

在这里,与大家分享一批很有用的 Node.js 的电子书资源。Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写...

jay603
今天
61
0
《伟大的博弈》读后感作文4100字

《伟大的博弈》读后感作文4100字: 五一小长假,作为工厂员工,没能跟上大家放假的步伐,窝家里两天没出门,逼着自己看完《伟大的博弈》,感触颇多。似乎不能消化,先记录第一遍作为幼稚的见...

原创小博客
昨天
5
0
单点登录-基于Redis+MySQL实现单点登录(SSO)

1. 为什么要用单独登录? 主要便于公司内部多系统统一认证授权管理,一次登录可访问多个跨域系统,也同时更加方便统一管理用户登录(员工离职需要拿掉登录权限、统计所有用户对系统的登录请求...

秋日芒草
昨天
2
0
827. Making A Large Island

思想: 将所有连通的 1 分成一个组,分配编号,然后使用BFS统计1的个数,得到这个组的面积。 遍历格子里所有为 0 的元素,检查四个方向的1所在的组并加上这个组面积。于是得到当前元素为 0 ...

reter
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部