Groovy
发布时间:2022-04-12 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了《groovy入门经典》读书笔记,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
一本不错的groovy编程入门书籍,基本上涵盖了groovy的方方面面,整本书采用教材的方式(知识点讲解+练习),因地对
一个java开发人员来说很容易读懂,所以
中文版署名为groovy入门经典. groovy大部分兼容java jdk,因此对于java开发人员来说,就需要重点掌握groovy与java不同.
脚本语言应该应用如下目的:
连接已有组件
处理经常变化的多种类型的实体
具有图形化
用户界面
拥有
快速变化的
功能
是小型或者中型项目的一部分.
在groovy字符串字面值中,使用单引号封装的字符串的值就是所列出的字符序列本身. 比如: 'My age is $
{ag
E}'
groovy
支持负数索引,但是顺序是从字符串的末尾开始往前计算,比如"
Hello world"[-1] == "d"
一些字符串的基本操作:
"Hello world" - "world" = "Hello" // 减法运算
"Hello world".count("o") = 2 // 统计次数
"Hello".center(11) // 将字符串居中,不足前后补充空格
"Hello".padLeft(11,"#") // ######Hello
"Hello".replaceAll("[a-z]"){Ch->ch.toUpperCase()} // HelLO
"Hello World".tokenize() // ["Hello","World"]
str1<=>str2 代表 str1.compareTo(str2)
在if或while语句中,当groovy操作符"=~"作为
一个谓词出现时,左边的操作数
String将和右边的正则表达式匹配
而在
一般的语句中则是定义
一个正则表达式,比如 def regex =~ "
Hello"
对于列表(数组,集合),如果整型索引为负数,这其引用的元素从列表末端开始向前移动.
通过<<运算符(leftShift
方法),可以把
一个新元素值追加到列表最后.
printf
输出中,
%s表示按原样
输出字符串,%20s在左侧
输出字符串,并且宽度为20, %-20s则在左侧
输出字符串.
当某个
方法的声明包含
默认参数时,
默认参数仅能出现在非
默认参数之后,也就是说,
默认参数只能出现在形参列表的最后面.
switch语句中case是
一个正则表达式的写法:
switch('1234') {
case ~'[0-9]{5}':
println '@R_673_10793@er is 5-digital sequence';
break;
case ~'[0-9]{4}':
println '@R_673_10793@er is 4-digital sequence';
break;
default:
println 'other @R_673_10793@er';
break;
}
collect
方法将遍历某个集合,并使用闭包中的变换
方法,将集合中的每个元素转换成
一个新值.
any
方法将遍历检查集合中的每
一个元素,以确认: 对于每
一个元素来说,某个布尔断言是否合法,该断言由闭包提供.
every
方法则用来检查:对集合的所有元素是否,某个断言(其返回值为true或
false的
一个闭包)是否合法.如果合法则返回true,否则返回
false
in
ject
方法用来遍历集合,首先将需要传递的值与集合元素传递给闭包,此时其传递的值将作为处理结果,然后再和每
一个集合元素一起传给闭包,以此类推.
例如:println ([2,3,4,
5].in
ject( 1)
{pre,element->pre*element; }) // 120
当
一个类包含
一个用户自定义的构造器之后,程序并不会
自动生成默认的构造器. 这个和java一致
单元测试就是使用程序员的经验来发现和纠正
代码中可能存在的
错误.
groovy中浮点数字
默认是Big
decimal的实例
正则表达式:
def regex = "([0-9]{3})-([0-9]{2})-([0-9]{4})"
def str = "123-45-6789"
def matcher = str =~ regex
matcher.matches()
println "${matcher[0]}" // [123-45-6789,123,45,6789]
println "${matcher[0][0]}" // 123-45-6789
println "${matcher[0][1]}" // 123
groovy中
默认的列表类型对应的是java中的ArrayList,如果要制定
为其他的类型,
可以这样写:
def @R_673_10793@ers = [] as LinkedList
@R_673_10793@ers.addAll([1,2,3])
println "@R_673_10793@ers:${@R_673_10793@ers.getClass().getName()}" // java.util.LinkedList
as子句只能用于空列表,如果这样用:
def @R_673_10793@ers= [1,3] as LinkedList;
将抛出异常,这
是因为我们试图把
一个ArrayList强制转换为LinkedList
当某个
方法需要使用数组值作为它的实参时,使用as子句就非常有效.比如这样写:
def names = ["Ken","John"]
def someMethod(String[] args){...}
someMethod(names as String[])
格式化
输出
引用
%[index$][flags][width][.precision]conversion
这里的inde
x是可选的,是
一个无符号整数,用来指示参数在参数列表中的位置,第
一个参数用1$引用,第二个参数用2$引用,以此类推
flags是一组用来更改格式
输出的字符
width非负十进制整型值,用来指定
输出字符的最小宽度.
precision是
一个非负十进制整型值,用来限制字符的个数
groovy并
不支持闭包定义中引用自己,但是将闭包作为Closure的
一个对象时,则在闭包体可以使用this关键字来引用自己.比如这样写(我在1.7.3版本中这样写执行报错):
def f = {n->
return (n==0) ? 1 : n * this.call(n-1);
}
customers[custom@R_673_10793@er].accounts.each{@R_673_10793@er,account -> println "${account}"}
采用这样的导航方式的
一个危险是,当遍历到
一个null值时,程序会抛出NullPointerException,为避免这种情况,可以使用"?."操作符提供的安全导航模式:
customers[custom@R_673_10793@er]?.accounts.each{@R_673_10793@er,account -> println "${account}"}