SlideShare une entreprise Scribd logo
1  sur  25
Groovy 简介 CRM_TPD sunhao
什么是 Groovy? ,[object Object]
什么是 Groovy? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],一体两面
HelloWorld 用   Java  编写的典型的   Hello World  示例如下所示: public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } 用   Groovy  编写的   Hello World : println "Hello World!" 在这段代码周围没有类结构,而且也没有方法结构!我还使用   println  代替了   System.out.println 。
没有类型的   Java  代码 ,[object Object],在   Java  中,如果要声明一个   String  变量,则必须输入: String value = "Hello World"; Groovy  允许省略   value  前面的   String  类型变量,并用   def  代替。 def value = "Hello World“ def message = 123 println value.class 实际上, Groovy  会根据对象的值来判断它的类型。 在   Groovy  中 “一切都是对象”
无类型有什么意义 ? ,[object Object],[object Object],[object Object],开始体验循环
更好、更短的循环 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],实际上,它很像   JavaScript 但它就是   Java  代码,只不过是用   Groovy  的样式编写的。
Groovy  中的范围 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
默认参数值 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Groovy boolean  值 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Groovy  集合 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],而   Groovy  可以直接在语言内使用集合。在   Groovy  中,不需要导入专门的类,也不需要初始化对象。
Groovy  集合 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],coll.add(&quot;Python&quot;) coll << &quot;Smalltalk&quot; coll[5] = &quot;Perl&quot;
Groovy  集合 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],魔法方法 def numbers = [1,2,3,4] assert numbers.join(&quot;,&quot;) == &quot;1,2,3,4&quot;  assert [1,2,3,4,3].count(3) == 2 assert [&quot;JAVA&quot;, &quot;GROOVY&quot;] == [&quot;Java&quot;,&quot;Groovy&quot;]*.toUpperCase()
Groovy  映射 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Groovy  映射中的键不必是   String 。在这个示例中, name  看起来像一个变量,但是在幕后, Groovy  会将它变成   String 。 传统取键值方法: hash.put(&quot;id&quot;, 23) assert hash.get(&quot;name&quot;) == &quot;Andy&quot;
有 Groovy  特色的 映射 ,[object Object],[object Object],[object Object],[object Object],[object Object]
位置映射 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Groovy  中的闭包 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],acoll.each{ println it } 请注意, each  直接在   acoll  实例内调用,而   acoll  实例的类型是   ArrayList 。在   each  调用之后,引入了一种新的语法  , 由   {}  包围起来可以用作函数参数和方法参数的代码块。
Groovy  中的闭包 ,[object Object],[object Object],[object Object],[object Object],[object Object],如果想在前面一节 “ Groovy  中的映射” 中的   hash  对象上迭代,可以编写以下代码: def hash = [name:&quot;Andy&quot;, &quot;VPN-#&quot;:45] hash.each{ key, value -> println &quot;${key} : ${value}&quot; }
Groovy  中的闭包 ,[object Object],[object Object],[object Object],[object Object],[object Object]
Groovy  中的闭包 ,[object Object],[object Object],[object Object]
Groovy  中的闭包 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],Groovy  中的闭包 interface MultiFuncTest {     def test1()     def test2(str) } def impl = [test1:{println'test'},         test2:{str -> println str}] as MultiFuncTest impl.test1() impl.test2('ok')
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Groovy  中的闭包 这个 例子 就 是狗爸爸让老猫帮忙照看他的狗儿子玩游戏。
[object Object],Groovy  与 spring 集成 groovy 修改后可在 java 系统运行期间立即生效。 ,[object Object],设置默认刷新检查延时 <lang:defaults   refresh-check-delay=&quot;2000&quot;/>       <lang:groovy   id=&quot;pdfGenerator&quot;            script-source=&quot;classpath:groovierspring/GroovyPdfGenerator.groovy&quot;            refresh-check-delay=&quot;6000&quot;>       <lang:property   name=&quot;companyName&quot;   value=&quot;Refreshable   Groovy   Bookstore&quot;/>    </lang:groovy>       <lang:groovy   id=&quot;invoiceEmailer&quot;            script-source=&quot;classpath:groovierspring/GroovyInvoiceEmailer.groovy&quot;            refresh-check-delay=&quot;-1&quot;/>
谢谢!

Contenu connexe

Tendances

Corona 初探 lua 語言,玩跨平台(iOS & android) 行動裝置開發工具
Corona 初探 lua 語言,玩跨平台(iOS &  android) 行動裝置開發工具Corona 初探 lua 語言,玩跨平台(iOS &  android) 行動裝置開發工具
Corona 初探 lua 語言,玩跨平台(iOS & android) 行動裝置開發工具政斌 楊
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
Ecmascript
EcmascriptEcmascript
Ecmascriptjay li
 
Go语言: 互联网时代的C
Go语言: 互联网时代的CGo语言: 互联网时代的C
Go语言: 互联网时代的CGoogol Lee
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
Light talk @ coscup 2011 : Incremental Global Prelink for Android
Light talk @ coscup 2011 : Incremental Global Prelink for AndroidLight talk @ coscup 2011 : Incremental Global Prelink for Android
Light talk @ coscup 2011 : Incremental Global Prelink for AndroidKito Cheng
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)Leo Hui
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析wavefly
 
Python 入门
Python 入门Python 入门
Python 入门kuco945
 
程式人雜誌 2015年五月
程式人雜誌 2015年五月程式人雜誌 2015年五月
程式人雜誌 2015年五月鍾誠 陳鍾誠
 
Python学习笔记
Python学习笔记Python学习笔记
Python学习笔记Lingfei Kong
 
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)Kai-Feng Chou
 
Gobject - Inherit (Chinese)
Gobject - Inherit (Chinese)Gobject - Inherit (Chinese)
Gobject - Inherit (Chinese)Kai-Feng Chou
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closureswang hongjiang
 
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhouWill Zhou
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗乐群 陈
 

Tendances (18)

Corona 初探 lua 語言,玩跨平台(iOS & android) 行動裝置開發工具
Corona 初探 lua 語言,玩跨平台(iOS &  android) 行動裝置開發工具Corona 初探 lua 語言,玩跨平台(iOS &  android) 行動裝置開發工具
Corona 初探 lua 語言,玩跨平台(iOS & android) 行動裝置開發工具
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
Ecmascript
EcmascriptEcmascript
Ecmascript
 
Go语言: 互联网时代的C
Go语言: 互联网时代的CGo语言: 互联网时代的C
Go语言: 互联网时代的C
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
Light talk @ coscup 2011 : Incremental Global Prelink for Android
Light talk @ coscup 2011 : Incremental Global Prelink for AndroidLight talk @ coscup 2011 : Incremental Global Prelink for Android
Light talk @ coscup 2011 : Incremental Global Prelink for Android
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
 
Python 入门
Python 入门Python 入门
Python 入门
 
程式人雜誌 2015年五月
程式人雜誌 2015年五月程式人雜誌 2015年五月
程式人雜誌 2015年五月
 
Python学习笔记
Python学习笔记Python学习笔记
Python学习笔记
 
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)
 
Gobject - Inherit (Chinese)
Gobject - Inherit (Chinese)Gobject - Inherit (Chinese)
Gobject - Inherit (Chinese)
 
functional-scala
functional-scalafunctional-scala
functional-scala
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closures
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhou
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗
 

En vedette

Oferta alemania empaquetadores
Oferta alemania empaquetadoresOferta alemania empaquetadores
Oferta alemania empaquetadoresformaciopuig
 
Ian Egan Cartoon Portfolio
Ian Egan Cartoon PortfolioIan Egan Cartoon Portfolio
Ian Egan Cartoon PortfolioIanEgan
 
Gao regenerative medicine_letter
Gao regenerative medicine_letterGao regenerative medicine_letter
Gao regenerative medicine_letterJohn Redaelli
 
Ref 226. Dependiente/a Carniceria
Ref  226. Dependiente/a CarniceriaRef  226. Dependiente/a Carniceria
Ref 226. Dependiente/a Carniceriaformaciopuig
 
Notiziario 10
Notiziario 10Notiziario 10
Notiziario 10akivulka
 

En vedette (8)

Oferta alemania empaquetadores
Oferta alemania empaquetadoresOferta alemania empaquetadores
Oferta alemania empaquetadores
 
Ian Egan Cartoon Portfolio
Ian Egan Cartoon PortfolioIan Egan Cartoon Portfolio
Ian Egan Cartoon Portfolio
 
AFMC Biology 1994
AFMC Biology  1994AFMC Biology  1994
AFMC Biology 1994
 
Dato
DatoDato
Dato
 
Gao regenerative medicine_letter
Gao regenerative medicine_letterGao regenerative medicine_letter
Gao regenerative medicine_letter
 
Ref. 217
Ref. 217Ref. 217
Ref. 217
 
Ref 226. Dependiente/a Carniceria
Ref  226. Dependiente/a CarniceriaRef  226. Dependiente/a Carniceria
Ref 226. Dependiente/a Carniceria
 
Notiziario 10
Notiziario 10Notiziario 10
Notiziario 10
 

Similaire à Groovy简介

Groovy:Candy for Java Developers
Groovy:Candy for Java DevelopersGroovy:Candy for Java Developers
Groovy:Candy for Java Developersfoxgem
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 
Maintainable PHP Source Code
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source CodeBo-Yi Wu
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closureswang hongjiang
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 
Grails敏捷项目开发
Grails敏捷项目开发Grails敏捷项目开发
Grails敏捷项目开发Michael Yan
 
Java面试题集
Java面试题集Java面试题集
Java面试题集yiditushe
 
Golang 入門初體驗
Golang 入門初體驗Golang 入門初體驗
Golang 入門初體驗政斌 楊
 
Java面试知识
Java面试知识Java面试知识
Java面试知识yiditushe
 
Ruby程式語言入門導覽
Ruby程式語言入門導覽Ruby程式語言入門導覽
Ruby程式語言入門導覽Mu-Fan Teng
 
线程与并发
线程与并发线程与并发
线程与并发Tony Deng
 
Java面试32题
Java面试32题Java面试32题
Java面试32题yiditushe
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Effective linux.1.(commandline)
Effective linux.1.(commandline)Effective linux.1.(commandline)
Effective linux.1.(commandline)wang hongjiang
 
大公司的Java面试题集
大公司的Java面试题集大公司的Java面试题集
大公司的Java面试题集yiditushe
 
Groovy for Java Programmer
Groovy for Java ProgrammerGroovy for Java Programmer
Groovy for Java Programmerfoxgem
 

Similaire à Groovy简介 (20)

Groovy:Candy for Java Developers
Groovy:Candy for Java DevelopersGroovy:Candy for Java Developers
Groovy:Candy for Java Developers
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 
Maintainable PHP Source Code
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source Code
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
 
Scala
ScalaScala
Scala
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
Golang
GolangGolang
Golang
 
Grails敏捷项目开发
Grails敏捷项目开发Grails敏捷项目开发
Grails敏捷项目开发
 
SCJP ch17
SCJP ch17SCJP ch17
SCJP ch17
 
Java面试题集
Java面试题集Java面试题集
Java面试题集
 
第五章
第五章第五章
第五章
 
Golang 入門初體驗
Golang 入門初體驗Golang 入門初體驗
Golang 入門初體驗
 
Java面试知识
Java面试知识Java面试知识
Java面试知识
 
Ruby程式語言入門導覽
Ruby程式語言入門導覽Ruby程式語言入門導覽
Ruby程式語言入門導覽
 
线程与并发
线程与并发线程与并发
线程与并发
 
Java面试32题
Java面试32题Java面试32题
Java面试32题
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Effective linux.1.(commandline)
Effective linux.1.(commandline)Effective linux.1.(commandline)
Effective linux.1.(commandline)
 
大公司的Java面试题集
大公司的Java面试题集大公司的Java面试题集
大公司的Java面试题集
 
Groovy for Java Programmer
Groovy for Java ProgrammerGroovy for Java Programmer
Groovy for Java Programmer
 

Groovy简介

  • 2.
  • 3.
  • 4. HelloWorld 用 Java 编写的典型的 Hello World 示例如下所示: public class HelloWorld { public static void main(String[] args) { System.out.println(&quot;Hello World!&quot;); } } 用 Groovy 编写的 Hello World : println &quot;Hello World!&quot; 在这段代码周围没有类结构,而且也没有方法结构!我还使用 println 代替了 System.out.println 。
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

Notes de l'éditeur

  1. 工欲善其事,必先利其器 Groovy 并没有取代 Java ,而是作为 Java 的补充,它提供了更简单、更灵活的语法,可以在运行时动态地进行类型检查。您可以使用 Groovy 随意编写 Java 应用程序,连接 Java 模块,甚至扩展现有的 Java 应用程序 — 甚至可以用 Groovy 对 Java 代码进行单元测试。 Groovy 的美妙之处还在于,它能够比编写纯粹的 Java 代码更快地完成所有工作 — 有时候会快许多。
  2. Groovy 代码还能在运行时轻松地改变自己。这实际上意味着,能够在运行时轻松地为对象指定新方法和属性。这一编程领域称为元编程 。
  3. Java 的 HelloWorld 同样在 groovy 中运行自如。
  4. 事实上 Groovy 只是规则少一些
  5. assert 命令用来证明范围是 java.util.List 的实例
  6. assert 命令用来证明范围是 java.util.List 的实例
  7. assert 命令用来证明范围是 java.util.List 的实例
  8. 实际上在 for 循环中并不需要类型声明,因为 Groovy 已经将迭代转变为任何集合的直接成员。在这个示例中,不必获取 Iterator 实例并直接操纵它,可以直接在集合上迭代。而且,通常放在循环构造内的行为(例如 for 循环体中 println )接下来要放在闭包内。
  9. 实际上在 for 循环中并不需要类型声明,因为 Groovy 已经将迭代转变为任何集合的直接成员。在这个示例中,不必获取 Iterator 实例并直接操纵它,可以直接在集合上迭代。而且,通常放在循环构造内的行为(例如 for 循环体中 println )接下来要放在闭包内。
  10. 实际上在 for 循环中并不需要类型声明,因为 Groovy 已经将迭代转变为任何集合的直接成员。在这个示例中,不必获取 Iterator 实例并直接操纵它,可以直接在集合上迭代。而且,通常放在循环构造内的行为(例如 for 循环体中 println )接下来要放在闭包内。
  11. 实际上在 for 循环中并不需要类型声明,因为 Groovy 已经将迭代转变为任何集合的直接成员。在这个示例中,不必获取 Iterator 实例并直接操纵它,可以直接在集合上迭代。而且,通常放在循环构造内的行为(例如 for 循环体中 println )接下来要放在闭包内。
  12. 实际上在 for 循环中并不需要类型声明,因为 Groovy 已经将迭代转变为任何集合的直接成员。在这个示例中,不必获取 Iterator 实例并直接操纵它,可以直接在集合上迭代。而且,通常放在循环构造内的行为(例如 for 循环体中 println )接下来要放在闭包内。
  13. delegate 委托在是一种常用设计模式,但在 java 中实现相对比较繁琐, groovy 直接在 GroovyObject 中已经实现了 delegate 模式,所以在 groovy 中应用 delegate 很方便。
  14. 目前实现的业务系统是 java 编写的,但是一些业务频繁变化又要求立刻生效,而且业务也比较复杂,一时不好抽象成规整的可复用 java 代码。于是考虑修改当前业务系统。基础业务和 web 界面还是用 java 相关技术实现,将比较动态和逻辑模糊的业务抽取出来,用 groovy 实现。 如果在应用程序正在运行时对 GroovyPdfGenerator.groovy 脚本做出更改, Spring 将检测到这一更改,并在运行时重新装载 pdfGenerator bean ,而不必重新启动。注意,只有达到规定的延迟时间, 并且 可刷新 bean 上发生方法调用,才会发生刷新检查。例如,假设 pdfGenerator bean 的刷新检查延时为 10 秒,但是连续 50 秒内没有发生方法调用。在这种情况下, Spring 会在 50 秒之后(而不是每过 10 秒)检查是否需要刷新。换句话说, Spring 不会积极地轮询脚本的更改;相反,它判断自上次方法调用后经过的时间,然后计算这段时间是否超过刷新检查延时。只有当经过的时间超过刷新检查延时, Spring 才检查脚本是否被更改,进而确定是否需要刷新。另一方面,假设 pdfGenerator bean 处于较重的负载下,每一秒钟它的方法被多次调用。如果 refresh-check-delay 为 10 秒,无论这个 bean 被使用多少次,它最快只能每 10 秒重新装载一次。所以,不需要担心 Spring 是否会因为积极地轮询 Groovy 脚本而消耗系统资源,它并没有这样做。