19
胡胡 www.groovyq.net Groovy for Java Programmer

Groovy for Java Programmer

  • Upload
    foxgem

  • View
    1.228

  • Download
    13

Embed Size (px)

Citation preview

Page 1: Groovy for Java Programmer

胡键www.groovyq.net

Groovy for Java Programmer

Page 2: Groovy for Java Programmer

借用 Python 的一个漫画

Groovy can make you fly!

http://www.mostly-useless.com/blog/2007/12/07/python-makes-you-fly/

Page 3: Groovy for Java Programmer

兼容绝大多数 Java 语法良好的互操作性代码简练,去掉了大部分的boilerplate code

动态语言的好处健康的生态系统

Groovy 对于 Java 开发者的优势

Page 4: Groovy for Java Programmer

自动 import 常用的包:java.lang 、 java.util 、 java.io 、 java.netgroovy.lang 、 groovy.util

缺省使用更精确的数值类:java.math.BigDecimaljava.math.BigInteger

Groovy 的特点

Page 5: Groovy for Java Programmer

简化的语法:System.out.println => printlnSystem.out.print => print在参数个数 >1 时,可省略括号

a.f p1,p2return 可选,省略时,最后一个语句值为返回值 ; 可选方法、类缺省是 public?. 操作符: a?.f()assert 总是有效: power assert改进的循环:

1.upto(3){…} 、 3.times{…} 、 0.step(3,1){…} Groovy TruthAs 操作符

Groovy 的特点

Page 6: Groovy for Java Programmer

让集合变得更好用优化定义:

List : [1, 3, 4, 1, 8, 9, 2, 6]Map : ['C++' : 'Stroustrup' , 'Java' : 'Gosling' ,

'Lisp' : 'McCarthy' ][] 操作符,索引类型可以是:

正、负、区间、键。大量方便的方法:

each 、 reverseEach 、 eachWithIndex 、 collect 、 find 、 findAll 、 findIndexOf 、 sum 、 inject 、 join 、flatten 、 groupBy 、 any 、 every……

Groovy 的特点

Page 7: Groovy for Java Programmer

字符串的改进三种定义:’’、””、””””””GString :“ Today $company stock closed at

$price”字符串 = 字符集合,可直接使用任何集合方法和操作

符正则表达式:

定义方式 ~”RegEx” 或 /RegEx/匹配: =~ 、 ==~

Groovy 的特点

Page 8: Groovy for Java Programmer

Duck Typing如果走路像鸭子,叫声像鸭子,那它就是鸭子

Groovy 的特点

class Rectangle{ def draw(){ println "This is rectangle" }}class Square{ def draw(){ println "This is Square" }}def draw(painter){ painter.draw()}draw(new Rectangle())draw(new Square())

Page 9: Groovy for Java Programmer

闭包无处不在定义: def c= {…}特点:似函数而非函数,代码即数据

Groovy 的特点

def m= [echo:{ x -> println x}]m.echo "a"

[1,2,3].each{ println it}

String.metaClass.deleteSvnDir = { def f = new File(delegate) f.eachDir { if (it.name == '.svn') { it.deleteDir() } else { it.absolutePath.deleteSvnDir() } }}

Page 10: Groovy for Java Programmer

GroovyBean : JavaBean 的升级版定义的是属性,故无需 getter/setter构造函数中可使用命名参数缺省为 public

Groovy 的特点

class MyBean{ String name def hi(){ println "Hi $name!" }}

def mb= new MyBean(name:"foxgem")println mb.namemb.name="jianhu"println mb.namemb.hi()

Page 11: Groovy for Java Programmer

强大的 MOP ,运行时改变类的行为方法拦截

before 、 after 、 around方法注入

给类添加新方法方法合成

“ 拦截、缓存、调用”模式

Groovy 的特点

class MyBean{ //方法拦截的例子 String name def hi(){ println "Hi $name!" } def aroundThis(){ println "Should not be shown!" }}MyBean.metaClass.invokeMethod={String method, args -> println "before invoking $method" if(method != "aroundThis"){ MyBean.metaClass.getMetaMethod(method, args) .invoke(delegate, args) } println "after invoking $method"}def mb= new MyBean(name:"foxgem")mb.hi()mb.aroundThis()

Page 12: Groovy for Java Programmer

便捷的 XML 处理DOMCategoryXMLParserXMLSlurper

Groovy 的特点

//XmlParser的例子def xml = """ <languages> <language name="C++"> <author>Stroustrup</author> </language> <language name="Java"> <author>Gosling</author> </language></languages>"""

languages = new XmlParser().parseText(xml)languages.each { println "${it.@name} authored by ${it.author[0].text()}"}

Page 13: Groovy for Java Programmer

AST Transformation编译时的 MOP ,直接作用于字节码,类似静态的

AOP 编织过程Groovy 缺省提供了大量的 Transformation

@Category 、 @Mixin 、 @Delegate 、 @Immutable、 @Lazy 、 @Singleton 、 @Log 、 @Newify 、 @PackageScope 、 @Bindable 、 @Vetoable 、 @EqualsAndHashCode……

允许创建自己的 Transformation

Groovy 的特点

Page 14: Groovy for Java Programmer

GDK 给 Java 对象添加了大量便捷方法一个 GSQL 的例子

Groovy 的特点

def createTree(level, parent){ def rows= db.rows(createQueryString(parent)) rows.each{ row -> println row outFile.withWriterAppend{ writer-> level.times{ writer << '-' } writer << "$row.obj_desc,'$row.obj_code'" << '\n' } createTree(level+1, row.obj_code) }}db= Sql.newInstance( "jdbc:oracle:thin:@10.60.1.1:1521:d7i", "d7i“,"d7i", "oracle.jdbc.driver.OracleDriver")try{ outFile = new File('d:/output.csv') outFile.delete() createTree(0, null)}catch(e){ println e }Finally{ db.close() }

Page 15: Groovy for Java Programmer

Builder缺省的几个 Builder :

MarkupBuilder 、 AntBuilder 、 SwingBuilder……

Groovy 的特点

def builder = new groovy.xml.MarkupBuilder()def objects = builder.users { user(id:1001) { name(first:"Jian",second:"Hu") birthday(year:"yyyy1",month:"mm1") } user(id:1002) { name(first:"Gem",second:"Fox") birthday(year:"yyyy2",month:"mm2") }}

Page 16: Groovy for Java Programmer

Builder构建 DSL 的利器:

扩展 BuilderSupport利用 FactoryBuilderSupport

Groovy 的特点

Page 17: Groovy for Java Programmer

Groovy 的生态系统

除了这些,几乎主流 Java 开源框架都支持 Groovy 。

其余请参考:http://groovy.codehaus.org/Modules

Page 18: Groovy for Java Programmer

大量的参考书籍

Page 19: Groovy for Java Programmer

关于更多 Groovy/Grails 的中文信息,请访问:

谢谢!

http://www.groovyq.net