《groovy入门经典》读书笔记

[align=center][img]http://img2.douban.com/lpic/s3348862.jpg[/img][/align]

一本不错的groovy编程入门书籍, 基本上涵盖了groovy的方方面面, 整本书采用教材的方式(知识点讲解+练习), 因地对一个java开发人员来说很容易读懂, 所以中文版署名为groovy入门经典. groovy大部分兼容java jdk, 因此对于java开发人员来说, 就需要重点掌握groovy与java不同.

脚本语言应该应用如下目的:
连接已有组件
处理经常变化的多种类型的实体
具有图形化用户界面
拥有快速变化的功能
是小型或者中型项目的一部分.

在groovy字符串字面值中, 使用单引号封装的字符串的值就是所列出的字符序列本身. 比如: 'My age is ${age}'

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 'number is 5-digital sequence';
break;
case ~'[0-9]{4}':
println 'number is 4-digital sequence';
break;
default:
println 'other number';
break;
}


collect方法将遍历某个集合, 并使用闭包中的变换方法, 将集合中的每个元素转换成一个新值.
any方法将遍历检查集合中的每一个元素, 以确认: 对于每一个元素来说, 某个布尔断言是否合法, 该断言由闭包提供.
every方法则用来检查:对集合的所有元素是否, 某个断言(其返回值为true或false的一个闭包)是否合法.如果合法则返回true, 否则返回false
inject方法用来遍历集合, 首先将需要传递的值与集合元素传递给闭包, 此时其传递的值将作为处理结果, 然后再和每一个集合元素一起传给闭包, 以此类推.
例如:println ([2,3,4,5].inject( 1) {pre, element->pre*element; }) // 120
当一个类包含一个用户自定义的构造器之后, 程序并不会自动生成默认的构造器. 这个和java一致

单元测试就是使用程序员的经验来发现和纠正代码中可能存在的错误.

groovy中浮点数字默认是BigDecimal的实例

正则表达式:
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 numbers = [] as LinkedList
numbers.addAll([1,2,3])
println "numbers:${numbers.getClass().getName()}" // java.util.LinkedList


as子句只能用于空列表, 如果这样用:
def numbers= [1,2,3] as LinkedList;

将抛出异常, 这是因为我们试图把一个ArrayList强制转换为LinkedList
当某个方法需要使用数组值作为它的实参时, 使用as子句就非常有效.比如这样写:
def names = ["Ken", "John"]
def someMethod(String[] args){...}
someMethod(names as String[])


格式化输出
[quote]%[index$][flags][width][.precision]conversion[/quote]
这里的index是可选的, 是一个无符号整数, 用来指示参数在参数列表中的位置, 第一个参数用1$引用, 第二个参数用2$引用, 以此类推
flags是一组用来更改格式输出的字符
width非负十进制整型值, 用来指定输出字符的最小宽度.
precision是一个非负十进制整型值, 用来限制字符的个数

groovy并不支持闭包定义中引用自己, 但是将闭包作为Closure的一个对象时, 则在闭包体可以使用this关键字来引用自己.比如这样写(我在1.7.3版本中这样写执行报错):
def f = {n->
return (n==0) ? 1 : n * this.call(n-1);
}


customers[customNumber].accounts.each{number, account -> println "${account}"}

采用这样的导航方式的一个危险是, 当遍历到一个null值时, 程序会抛出NullPointerException, 为避免这种情况, 可以使用"?."操作符提供的安全导航模式:
customers[customNumber]?.accounts.each{number, account -> println "${account}"}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Groovy入门经典》奉书内容全面详尽,浅显易懂,易于选择性阅读。可以作为对Groovy语言感兴趣的计算机软件开发人员的参考书。.., Groovy是唯一能够扩展Java平台的脚本语言。Groovy提供类似于Java的语法结构,本地化支持映射和列表、方法、类,闭包和构造器等结构。由于具有动态弱类型,以及无缝访问JavaAPI等特性,Groovy语言非常适合子开发中小型规模的应用程序。, 相对于Java语言,Groovy语言的表述性更强,抽象程度更高。它使得应用程序开发更加快捷,提升了程序员生产力。Groovy语言可以用作应用程序的“黏合剂”,而不必实现复杂的数据结构和算法。, 与Java代码比较起来,Groovy语言的另一个主要优势是,Groovy代码编写量相对小些。在一般情况下,Java代码过于复杂,难于理解和维护。这是因为Java需要大量的模板文件或者转换代码,而Groovy却不需要。, 本书是有关Groovy的第一本正式出版物,作者Kenneth Barclay和John Savage介绍了Groovy开发的所有主要领域,并解释了这种创新性的编程语言给Java平台赋予的动态特性。阅读本书只要求具备Java编程的一般性知识。不管你是经验丰富的Java开发者,还是脚本语言的新手,都会得到如何充分利用Groovy语言的专家性指导。, 本书特点第一本全面讲解Groovy编程的图书,演示如何快速和轻松地编写适用于Java平台的应用程序和脚本。, 本书由高水平软件工程师精心编写,并得到计算机老师和专家的高度赞扬。, 提供大量编程范例、代码范例、详细的案例分析、习题,非常适合自学。本书还有一个支持网站;并提供一个基于Windows的Groovy编辑器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值