医德是什么| 什么是老年斑图片| 疱疹性咽峡炎吃什么药| npn是什么意思| KT是什么| 女人卵巢保养吃什么好| 含羞草为什么会害羞| 莲花代表什么象征意义| 夏侯霸为什么投降蜀国| 彰字五行属什么| 4月份有什么节日| 女生腰疼是什么原因| 胎动少是什么原因| 老花眼是什么症状| 刚刚什么地方地震了| 总是失眠是什么原因| 同样的药为什么价格相差很多| 感冒吃什么恢复快| 氢氧化钠是什么| 在水一方是什么意思| 脚心长痣代表什么| 一什么桃子| 大悲咒什么意思| 伐木累是什么意思| 心慌心悸吃什么药| 铁锚是什么意思| 膀胱壁增厚毛糙是什么意思| 美女如云什么意思| 头发长得慢是什么原因| 看手指甲挂什么科室| 小孩肚子疼拉肚子吃什么药| 爆菊是什么意思| 小孩脚后跟疼是什么原因| 做春梦是什么意思| 嘴唇红肿是什么原因| ntc是什么| 姓林的女孩取什么名字好| 康波是什么意思| 白色蛇是什么蛇| 星光是什么意思| 什么的什么是什么的伞| 超敏c反应蛋白高是什么意思| 孕妇怕冷是什么原因| 脑供血不足吃什么中成药好| 莹字五行属什么| 了不起是什么意思| 人走了说什么安慰的话| 急性肠胃炎吃什么水果| 苏打水有什么作用| 梦见棉花是什么意思| 肝郁脾虚吃什么药效果最好| 冲凉是什么意思| 糖尿病有什么症状| 一失足成千古恨是什么意思| 名列前茅是什么生肖| 73年属牛的是什么命| 有点咳嗽吃什么药| 大张伟原名叫什么| 月经吃什么食物好| 凝血常规是查什么的| 被臭虫咬了擦什么药| 14k金是什么意思| 花字五行属什么| 6月30是什么星座| 孕妇鼻炎犯了可以用什么药治疗| 圣是什么生肖| 6点是什么时辰| 生的反义词是什么| 作业是什么意思| 酸儿辣女什么意思| 468是什么意思| 什么病不能吃芒果| 不排大便是什么原因| 草莓什么季节| 元旦唱什么歌| 骨蒸潮热 是什么意思| 舌炎吃什么药效果最好| 胃火牙疼吃什么药好| baron是什么意思| 奥林匹克精神是什么| 宁五行属性是什么| 1964年是什么命| 手上长汗疱疹用什么药| 什么样的菊花| 达字五行属什么| 砭石是什么石头| 大腿为什么会长妊娠纹| 手指伸不直是什么原因| 中国人为什么要学英语| 骨折吃什么药好得快| 指甲黑是什么原因| herry是什么意思| 梦到捡金子首饰是什么意思| 扁桃体发炎是什么引起的| 高血脂是什么意思| 乌龟属于什么动物| 氯气什么味道| 熙熙攘攘是什么意思| 暗渡陈仓是什么生肖| 西班牙用的是什么货币| 失眠吃什么药效果好| 四时感冒什么意思| 宫颈肥大是什么原因造成的| 念珠菌性阴道炎用什么药| 小狗什么时候可以洗澡| bp在医学上是什么意思| 黄瓜炒什么| 卡西欧属于什么档次| 纲是什么意思| 狗不吃饭是什么原因| 红糖的原料是什么| 阴囊潮湿吃什么药| 忠实是什么意思| 办理健康证需要带什么| 上海有什么景点| 晚上夜尿多是什么原因| 漏尿是什么原因引起的| 樱桃是什么季节的水果| 玥字属于五行属什么| advil是什么药| 婴儿大便隐血阳性是什么意思| 12月16号是什么星座| 炸毛是什么意思| 痛风不能吃什么食物表| 什么哲理| 属兔的跟什么属相最配| 鹅蛋不能和什么一起吃| 下一年是什么生肖| ft什么单位| 什么是骨质疏松| 什么病会晕倒| 985大学什么意思| 执勤是什么意思| 羊属于什么科| 灰蓝色是什么颜色| 什么拜之交| 老赖是什么意思| 小猫起什么名字好听| 什么叫幽门螺旋杆菌| 龙眼有什么品种| 糖化血红蛋白是查什么的| 静待佳音什么意思| hpv59阳性是什么意思| 敲定是什么意思| 杨桃什么季节成熟| 亚硝酸钠是什么| calcium是什么意思| 茯苓的功效与作用是什么| 祛湿吃什么| 忌动土是什么意思| 乳铁蛋白对宝宝有什么好处| 开塞露的成分是什么| 数不胜数是什么生肖| 相伴是什么意思| 2015年五行属什么| 舌苔发白是什么原因| 感情洁癖什么意思| 数不胜数是什么生肖| 审阅是什么意思| 唇钉是干什么用的| 虎头蛇尾是什么意思| 测血糖挂号挂什么科| 已归档是什么意思| 午时是什么时候| 一个雨一个亏念什么| 四平八稳是什么意思| 胎毛什么时候剃最好| 预设是什么意思| 什么消炎药效果好| 全青皮是什么皮| 叶酸什么时候吃最好| 生化全项包括什么| 雄性激素是什么| 南宁有什么特产| 洗手指征是什么| 赴汤蹈火的汤是什么意思| 着凉拉肚子吃什么药| 血糖高能喝什么饮料| 为什么肠道总是咕咕的响| 肝囊性灶是什么意思| 痛风有什么不能吃| 站台是什么意思| 自强不息的息是什么意思| o血型的人有什么特点| 鞭挞是什么意思| dm是什么意思| 尿常规异常是什么意思| 肋骨骨折挂什么科| 宝宝拉肚子能吃什么| 肝阳性是什么意思| 蝴蝶有什么寓意| 藏毛窦是什么病| 什么情况需要打破伤风针| 小孩子发烧抽搐是什么原因| 无什么| 什么土方治咳嗽最有效| 12月3号是什么星座| 抢七是什么意思| 肖战是什么星座| 联字五行属什么| 中国的八大菜系是什么| 什么是小三阳| 天津市市长什么级别| 心包填塞三联征是什么| rf是什么| 子时是什么生肖| 吃什么食物排湿气| 4月26日是什么星座| 喝什么茶对睡眠有帮助| 脖子痛什么原因| 什么病治不好| 嘴唇痒边缘痒用什么药| mmhg是什么意思| 巡礼是什么意思| 肝不好吃什么调理| 舌头上火是什么原因| 关心则乱是什么意思| 孤独症有什么表现| 牙齿痛吃什么药最管用| 什么叫做绝对值| 主是什么结构的字体| 三文鱼为什么叫三文鱼| 吃什么不会便秘| 木木耳朵旁是什么字| 口疮反复发作什么原因| 梦见梅花鹿是什么预兆| 吃什么可以调理肠胃| 推车是什么意思| 吃什么能变白| 长时间手淫有什么危害| 脸上发红是什么原因| 芙字五行属什么| 脂溢性皮炎有什么症状| 闭关是什么意思| u是什么单位| 庆大霉素治疗鱼什么病| 成全是什么意思| 为什么会面瘫| 什么是招风耳图片| 胃疼挂什么科室| 入党有什么用| 牙龈为什么会萎缩| 去草原穿什么衣服拍照好看| 梦见花椒是什么意思| 月经迟迟不来是什么原因| 大黄米和小黄米有什么区别| 一抹是什么意思| rolls是什么意思| 退役和退伍有什么区别| 重阳节为什么要插茱萸| 脾胃不好吃什么| 傻子是什么意思| 二椅子什么意思| 心外科是看什么病的| 9月28号什么星座| 为什么卧室要用木地板| 压抑是什么意思| 高考移民是什么意思| 人参长什么样子图片| 儿化音是什么意思| 乳腺结节吃什么好| 食道炎用什么药最好| 为什么会长老年斑| 七月十一是什么星座| 百度Jump to content

福州 板材装饰加工中心,加工中心厂家免费送图

From Wikipedia, the free encyclopedia
Groovy
Groovy Logo
ParadigmMulti-paradigm: object-oriented, imperative, functional, aspect-oriented, scripting
Designed byJames Strachan
DeveloperPaul King (PMC Chair)
Jochen Theodorou (Tech Lead)
Guillaume Laforge
Cedric Champeau
Daniel Sun
Eric Milles
First appeared2003; 22 years ago (2003)
Stable release4.0.27[1] Edit this on Wikidata (24 May 2025; 2 months ago (24 May 2025)) [±]
Typing disciplineDynamic, static, strong, duck
PlatformJava SE
LicenseApache License 2.0
Filename extensions.groovy, .gvy, .gy, .gsh[2]
Websitegroovy-lang.org Edit this at Wikidata
Major implementations
Gradle, Grails
Influenced by
Java, Python, Ruby, Smalltalk, Perl
Influenced
Kotlin
百度 三、讲好中国故事,着力解决“失声就要挨骂”问题在国际和台港澳新闻交流工作中,坚持以习近平总书记重要讲话精神为指导,着力解决“失声就要挨骂”问题。

Apache Groovy is a Java-syntax-compatible object-oriented programming language for the Java platform. It is both a static and dynamic language with features similar to those of Python, Ruby, and Smalltalk. It can be used as both a programming language and a scripting language for the Java Platform, is compiled to Java virtual machine (JVM) bytecode, and interoperates seamlessly with other Java code and libraries. Groovy uses a curly-bracket syntax similar to Java's. Groovy supports closures, multiline strings, and expressions embedded in strings. Much of Groovy's power lies in its AST transformations, triggered through annotations.

Groovy 1.0 was released on January 2, 2007, and Groovy 2.0 in July, 2012. Since version 2, Groovy can be compiled statically, offering type inference and performance near that of Java.[3][4] Groovy 2.4 was the last major release under Pivotal Software's sponsorship which ended in March 2015.[5] Groovy has since changed its governance structure to a Project Management Committee in the Apache Software Foundation.[6]

History

[edit]

James Strachan first talked about the development of Groovy on his blog in August 2003.[7] In March 2004, Groovy was submitted to the Java Community Process (JCP) as JSR 241[8] and accepted by ballot. Several versions were released between 2004 and 2006. After the JCP standardization effort began, the version numbering changed, and a version called "1.0" was released on January 2, 2007. After various betas and release candidates numbered 1.1, on December 7, 2007, Groovy 1.1 Final was released and immediately renumbered as Groovy 1.5 to reflect the many changes made.

In 2007, Groovy won the first prize at JAX 2007 innovation award.[9] In 2008, Grails, a Groovy web framework, won the second prize at JAX 2008 innovation award.[10]

In November 2008, SpringSource acquired the Groovy and Grails company (G2One).[11] In August 2009 VMware acquired SpringSource.[12]

In April 2012, after eight years of inactivity, the Spec Lead changed the status of JSR 241 to dormant.[8]

Strachan had left the project silently a year before the Groovy 1.0 release in 2007.[citation needed] In Oct 2016, Strachan stated "I still love groovy (jenkins pipelines are so groovy!), java, go, typescript and kotlin".[13]

On July 2, 2012, Groovy 2.0 was released, which, among other new features, added static compiling and static type checking.

When the Pivotal Software joint venture was spun-off by EMC Corporation (EMC) and VMware in April 2013, Groovy and Grails formed part of its product portfolio. Pivotal ceased sponsoring Groovy and Grails from April 2015.[5] That same month, Groovy changed its governance structure from a Codehaus repository to a Project Management Committee (PMC) in the Apache Software Foundation via its incubator.[6] Groovy graduated from Apache's incubator and became a top-level project in November 2015.[14]

On February 7, 2020, Groovy 3.0 was released.[15] Version 4.0 was released on January 25, 2022.[16]

Features

[edit]

Most valid Java files are also valid Groovy files. Although the two languages are similar, Groovy code can be more compact, because it does not need all the elements that Java needs.[17] This makes it possible for Java programmers to learn Groovy gradually by starting with familiar Java syntax before acquiring more Groovy programming idioms.[18]

Groovy features not available in Java include both static and dynamic typing (with the keyword def), operator overloading, native syntax for lists and associative arrays (maps), native support for regular expressions, polymorphic iteration, string interpolation, added helper methods, and the safe navigation operator ?. to check automatically for null pointers (for example, variable?.method(), or variable?.field).[19]

Since version 2, Groovy also supports modularity (shipping only the jars that the project uses, thus reducing the size of Groovy's library), type checking, static compilation, Project Coin syntax enhancements, multicatch blocks and ongoing performance enhancements using the invokedynamic instruction introduced in Java 7.[20]

Groovy natively supports markup languages such as XML and HTML by using an inline Document Object Model (DOM) syntax. This feature enables the definition and manipulation of many types of heterogeneous data assets with a uniform and concise syntax and programming methodology.[citation needed]

Unlike Java, a Groovy source code file can be executed as an (uncompiled) script, if it contains code outside any class definition, if it is a class with a main method, or if it is a Runnable or GroovyTestCase. A Groovy script is fully parsed, compiled, and generated before executing (similar to Python and Ruby). This occurs under the hood, and the compiled version is not saved as an artifact of the process.[21]

GroovyBeans, properties

[edit]

GroovyBeans are Groovy's version of JavaBeans. Groovy implicitly generates getters and setters. In the following code, setColor(String color) and getColor() are implicitly generated. The last two lines, which appear to access color directly, are actually calling the implicitly generated methods.[22]

class AGroovyBean {
  String color
}

def myGroovyBean = new AGroovyBean()

myGroovyBean.setColor('baby blue')
assert myGroovyBean.getColor() == 'baby blue'

myGroovyBean.color = 'pewter'
assert myGroovyBean.color == 'pewter'

Groovy offers simple, consistent syntax for handling lists and maps, reminiscent of Java's array syntax.[23]

def movieList = ['Dersu Uzala', 'Ran', 'Seven Samurai']  // Looks like an array, but is a list
assert movieList[2] == 'Seven Samurai'
movieList[3] = 'Casablanca'  // Adds an element to the list
assert movieList.size() == 4

def monthMap = [ 'January' : 31, 'February' : 28, 'March' : 31 ]  // Declares a map
assert monthMap['March'] == 31  // Accesses an entry
monthMap['April'] = 30  // Adds an entry to the map
assert monthMap.size() == 4

Prototype extension

[edit]

Groovy offers support for prototype extension through ExpandoMetaClass, Extension Modules (only in Groovy 2), Objective-C-like Categories and DelegatingMetaClass.[24]

ExpandoMetaClass offers a domain-specific language (DSL) to express the changes in the class easily, similar to Ruby's open class concept:

Number.metaClass {
  sqrt = { Math.sqrt(delegate) }
}

assert 9.sqrt() == 3
assert 4.sqrt() == 2

Groovy's changes in code through prototyping are not visible in Java, since each attribute/method invocation in Groovy goes through the metaclass registry. The changed code can only be accessed from Java by going to the metaclass registry.

Groovy also allows overriding methods as getProperty(), propertyMissing() among others, enabling the developer to intercept calls to an object and specify an action for them, in a simplified aspect-oriented way. The following code enables the class java.lang.String to respond to the hex property:

enum Color {
  BLACK('#000000'), WHITE('#FFFFFF'), RED('#FF0000'), BLUE('#0000FF')
  String hex
  Color(String hex) { 
    this.hex = hex 
  }
}

String.metaClass.getProperty = { String property ->
  def stringColor = delegate
  if (property == 'hex') {
    Color.values().find { it.name().equalsIgnoreCase stringColor }?.hex
  }
}

assert "WHITE".hex == "#FFFFFF"
assert "BLUE".hex == "#0000FF"
assert "BLACK".hex == "#000000"
assert "GREEN".hex == null

The Grails framework uses metaprogramming extensively to enable GORM dynamic finders, like User.findByName('Josh') and others.[25]

Dot and parentheses

[edit]

Groovy's syntax permits omitting parentheses and dots in some situations. The following groovy code

take(coffee).with(sugar, milk).and(liquor)

can be written as

take coffee with sugar, milk and liquor

enabling the development of domain-specific languages (DSLs) that look like plain English.

Functional programming

[edit]

Although Groovy is mostly an object-oriented language, it also offers functional programming features.

Closures

[edit]

According to Groovy's documentation: "Closures in Groovy work similar to a 'method pointer', enabling code to be written and run in a later point in time".[26] Groovy's closures support free variables, i.e. variables that have not been explicitly passed as a parameter to it, but exist in its declaration context, partial application (that it terms 'currying'[27]), delegation, implicit, typed and untyped parameters.

When working on Collections of a determined type, the closure passed to an operation on the collection can be inferred:

list = [1, 2, 3, 4, 5, 6, 7, 8, 9]

/* 
 * Non-zero numbers are coerced to true, so when it % 2 == 0 (even), it is false.
 * The type of the implicit "it" parameter can be inferred as an Integer by the IDE.
 * It could also be written as:
 * list.findAll { Integer i -> i % 2 }
 * list.findAll { i -> i % 2 }
 */
def odds = list.findAll { it % 2 }

assert odds == [1, 3, 5, 7, 9]

A group of expressions can be written in a closure block without reference to an implementation and the responding object can be assigned at a later point using delegation:

// This block of code contains expressions without reference to an implementation
def operations = {
  declare 5
  sum 4
  divide 3
  print
}
/* 
 * This class will handle the operations that can be used in the closure above. Another class
 * could be declared having the same methods, but using, for example, webservice operations
 * in the calculations.
 */
class Expression {
  BigDecimal value

  /* 
   * Though an Integer is passed as a parameter, it is coerced into a BigDecimal, as was 
   * defined. If the class had a 'declare(Integer value)' method, it would be used instead.
   */
  def declare(BigDecimal value) {
    this.value = value
  }
  
  def sum(BigDecimal valueToAdd) {
    this.value += valueToAdd
  }
  
  def divide(BigDecimal divisor) {
    this.value /= divisor
  }
  
  def propertyMissing(String property) {
    if (property == "print") println value
  }
}
// Here is defined who is going to respond the expressions in the block of code above.
operations.delegate = new Expression()
operations()

Curry

[edit]

Usually called partial application,[27] this Groovy feature allows closures' parameters to be set to a default parameter in any of their arguments, creating a new closure with the bound value. Supplying one argument to the curry() method will fix argument one. Supplying N arguments will fix arguments 1 .. N.

def joinTwoWordsWithSymbol = { symbol, first, second -> first + symbol + second }
assert joinTwoWordsWithSymbol('#', 'Hello', 'World') == 'Hello#World'

def concatWords = joinTwoWordsWithSymbol.curry(' ')
assert concatWords('Hello', 'World') == 'Hello World'

def prependHello = concatWords.curry('Hello')
//def prependHello = joinTwoWordsWithSymbol.curry(' ', 'Hello')
assert prependHello('World') == 'Hello World'

Curry can also be used in the reverse direction (fixing the last N arguments) using rcurry().

def power = { BigDecimal value, BigDecimal power ->
  value**power
}

def square = power.rcurry(2)
def cube = power.rcurry(3)

assert power(2, 2) == 4
assert square(4) == 16
assert cube(3) == 27

Groovy also supports lazy evaluation,[28][29] reduce/fold,[30] infinite structures and immutability,[31] among others.[32]

JSON and XML processing

[edit]

On JavaScript Object Notation (JSON) and XML processing, Groovy employs the Builder pattern, making the production of the data structure less verbose. For example, the following XML:

<languages>
  <language year="1995">
    <name>Java</name>
    <paradigm>object oriented</paradigm>
    <typing>static</typing>
  </language>
  <language year="1995">
    <name>Ruby</name>
    <paradigm>functional, object oriented</paradigm>
    <typing>duck typing, dynamic</typing>
  </language>
  <language year="2003">
    <name>Groovy</name>
    <paradigm>functional, object oriented</paradigm>
    <typing>duck typing, dynamic, static</typing>
  </language>
</languages>

can be generated via the following Groovy code:

def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.languages {
  language(year: 1995) {
    name "Java"
    paradigm "object oriented"
    typing "static"
  }
  language (year: 1995) {
    name "Ruby"
    paradigm "functional, object oriented"
    typing "duck typing, dynamic"
  }
  language (year: 2003) {
    name "Groovy"
    paradigm "functional, object oriented"
    typing "duck typing, dynamic, static"
  }
}

and also can be processed in a streaming way through StreamingMarkupBuilder. To change the implementation to JSON, the MarkupBuilder can be swapped to JsonBuilder.[33]

To parse it and search for a functional language, Groovy's findAll method can serve:

def languages = new XmlSlurper().parseText writer.toString()

// Here is employed Groovy's regex syntax for a matcher (=~) that will be coerced to a 
// boolean value: either true, if the value contains our string, or false otherwise.
def functional = languages.language.findAll { it.paradigm =~ "functional" }
assert functional.collect { it.name } == ["Groovy", "Ruby"]

String interpolation

[edit]

In Groovy, strings can be interpolated with variables and expressions by using GStrings:[34]

BigDecimal account = 10.0
def text = "The account shows currently a balance of $account"
assert text == "The account shows currently a balance of 10.0"

GStrings containing variables and expressions must be declared using double quotes.

A complex expression must be enclosed in curly brackets. This prevents parts of it from being interpreted as belonging to the surrounding string instead of to the expression:

BigDecimal minus = 4.0
text = "The account shows currently a balance of ${account - minus}"
assert text == "The account shows currently a balance of 6.0"

// Without the brackets to isolate the expression, this would result:
text = "The account shows currently a balance of $account - minus"
assert text == "The account shows currently a balance of 10.0 - minus"

Expression evaluation can be deferred by employing arrow syntax:

BigDecimal tax = 0.15
text = "The account shows currently a balance of ${->account - account*tax}"
tax = 0.10

// The tax value was changed AFTER declaration of the GString. The expression 
// variables are bound only when the expression must actually be evaluated:
assert text == "The account shows currently a balance of 9.000"

Abstract syntax tree transformation

[edit]

According to Groovy's own documentation, "When the Groovy compiler compiles Groovy scripts and classes, at some point in the process, the source code will end up being represented in memory in the form of a Concrete Syntax Tree, then transformed into an Abstract Syntax Tree. The purpose of AST Transformations is to let developers hook into the compilation process to be able to modify the AST before it is turned into bytecode that will be run by the JVM. AST Transformations provides Groovy with improved compile-time metaprogramming capabilities allowing powerful flexibility at the language level, without a runtime performance penalty."[35]

Examples of ASTs in Groovy are:

  • Category and Mixin transformation
  • Immutable AST Macro
  • Newify transformation
  • Singleton transformation

among others.

The testing framework Spock uses AST transformations to allow the programmer to write tests in a syntax not supported by Groovy, but the relevant code is then manipulated in the AST to valid code.[36] An example of such a test is:

def "maximum of #a and #b is #c" () {
  expect:
  Math.max (a, b) == c

  where:
  a | b || c
  3 | 5 || 5
  7 | 0 || 7
  0 | 0 || 0
}

Traits

[edit]

According to Groovy's documentation, "Traits are a structural construct of the language that allows: composition of behaviors, runtime implementation of interfaces, behavior overriding, and compatibility with static type checking/compilation."

Traits can be seen as interfaces carrying both default implementations and state. A trait is defined using the trait keyword:

trait FlyingAbility { /* declaration of a trait */
  String fly() { "I'm flying!" } /* declaration of a method inside a trait */
}

Then, it can be used like a normal interface using the keyword implements:

class Bird implements FlyingAbility {} /* Adds the trait FlyingAbility to the Bird class capabilities */
def bird = new Bird() /* instantiate a new Bird */
assert bird.fly() == "I'm flying!" /* the Bird class automatically gets the behavior of the FlyingAbility trait */

Traits allow a wide range of abilities, from simple composition to testing.

Adoption

[edit]

Notable examples of Groovy adoption include:

IDE support

[edit]

Many integrated development environments (IDEs) and text editors support Groovy:

Dialects

[edit]

There is one alternative implementation of Groovy:

  • Grooscript converts Groovy code to JavaScript code.[46] Although Grooscript has some limitations compared to Apache Groovy, it can use domain classes in both the server and the client.[47] Plugin support for Grails version 3.0 is provided, as well as online code conversions.[48]

See also

[edit]

References

[edit]

Citations

[edit]
  1. ^ "Release 4.0.27". 24 May 2025. Retrieved 25 May 2025.
  2. ^ "Groovy Goodness: Default Groovy Script File Extensions".
  3. ^ "Groovy 2.0 Performance compared to Java". 25 Aug 2012.
  4. ^ "Java vs Groovy2.0 vs Scala Simple Performance Test". 10 Jul 2012. Archived from the original on 10 December 2012. Retrieved 7 October 2012.
  5. ^ a b "Groovy 2.4 And Grails 3.0 To Be Last Major Releases Under Pivotal Sponsorship". 19 Jan 2015.
  6. ^ a b "Groovy joins Apache Incubator". 11 Mar 2015.
  7. ^ James Strachan (29 Aug 2003). "Groovy - the birth of a new dynamic language for the Java platform". Archived from the original on 1 September 2003.
  8. ^ a b "Java Community Process JSR 241".
  9. ^ "Groovy wins first prize at JAX 2007 innovation award". 2025-08-06. Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  10. ^ "They say a lot can happen over a cup of coffee". Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  11. ^ "SpringSource Acquires Groovy and Grails company (G2One)". 11 Nov 2008.
  12. ^ "VMWare Acquires SpringSource". 10 Aug 2009.
  13. ^ "Tweet from James Strachan". November 24, 2016. Retrieved 2025-08-06.
  14. ^ "Announcement on dev mailing list".
  15. ^ "Release GROOVY_3_0_0 · apache/groovy". GitHub. Retrieved 2025-08-06.
  16. ^ "Release GROOVY_4_0_0 · apache/groovy". GitHub. Retrieved 2025-08-06.
  17. ^ K?nig 2007, pg. 32
  18. ^ "Groovy style and language feature guidelines for Java developers". Groovy.codehaus.org. Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  19. ^ "Groovy – Differences from Java". Groovy.codehaus.org. Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  20. ^ "What's new in Groovy 2.0?". 28 Jun 2012.
  21. ^ K?nig 2007, pp. 37-8
  22. ^ K?nig 2007, pp. 38-9
  23. ^ K?nig 2007, pp. 41-3
  24. ^ "JN3525-MetaClasses". Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  25. ^ "Metaprogramming Techniques in Groovy and Grails". 11 Jun 2009.
  26. ^ "Groovy - Closures". Archived from the original on 2025-08-06.
  27. ^ a b "Does groovy call partial application 'currying'", 10 Aug 2013
  28. ^ "Groovy - Lazy Transformation". Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  29. ^ "Side Notes: Lazy lists in Groovy". 3 Feb 2011.
  30. ^ "Groovy's Fold". 20 Jun 2011. Archived from the original on 13 February 2015. Retrieved 12 February 2015.
  31. ^ "Functional Programming with Groovy". 5 Nov 2011.
  32. ^ "Function programming in Groovy". Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  33. ^ "JsonBuilder". Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  34. ^ "Groovy Strings - Different ways of creating them". 26 Dec 2009.
  35. ^ "Compile-time Metaprogramming - AST Transformations". Archived from the original on 2025-08-06. Retrieved 2025-08-06.
  36. ^ King, Paul (2020). "A History of the Groovy Programming Language". Proc. ACM Program. Lang. 4: 53. doi:10.1145/3386326.
  37. ^ "Groovy DSL for OFBiz business logic". Apache OFBiz Project Open Wiki.
  38. ^ "Simple-methods examples using Groovy". Apache OFBiz Project Open Wiki.
  39. ^ "Grails at LinkedIn". Retrieved 2025-08-06.
  40. ^ "Jenkins Pipeline".
  41. ^ Rocher, Graeme (October 2, 2008). "Graeme Rocher's Blog: Sky.com relaunches written in Grails". Graeme Rocher's Blog. Retrieved 2025-08-06.
  42. ^ Security Analysis of Emerging Smart Home Applications
  43. ^ "Scripting and the Script Library | Scripting & Properties". www.soapui.org. Retrieved 2025-08-06.
  44. ^ "Wired.Com" (PDF). www.springsource.org. Retrieved 2025-08-06.
  45. ^ "XWiki SAS" (PDF). www.springsource.org. Retrieved 2025-08-06.
  46. ^ "Grooscript Documentation". 12 Sep 2016. Archived from the original on 28 June 2017. Retrieved 4 July 2017.
  47. ^ "Presentation at SpringOne/2GX on Grooscript". 13 Dec 2015.
  48. ^ "Grooscript online conversions". 15 May 2017. Archived from the original on 9 July 2017. Retrieved 4 July 2017.

Sources

[edit]
[edit]
放疗为什么死得更快 梦到生儿子有什么预兆 梅杰综合症是什么病 是谁送你来到我身边是什么歌 龟头敏感用什么药
磨牙吃什么药能治好 空气缸是什么意思 测怀孕什么时候最准 周边是什么 拉肚子吃什么药最好
阴道口发白是什么原因 艾是什么意思 蝶变是什么意思 澳门打车用什么软件 猪肝色是什么颜色
娃娃鱼是什么动物 同等学力是什么意思 迎春花是什么颜色的 雷什么风什么成语 路旁土命什么意思
卵泡长得慢是什么原因造成的hcv8jop6ns9r.cn 肌腱炎是什么症状hcv7jop7ns4r.cn 糖尿病吃什么菜最好hcv9jop3ns9r.cn 营养土是什么土creativexi.com 吃谷维素有什么副作用hcv7jop7ns3r.cn
什么是碱中毒bysq.com 七月十一是什么星座hcv7jop5ns2r.cn 不羁放纵是什么意思hcv7jop7ns3r.cn 高铁特等座有什么待遇hcv7jop5ns4r.cn 霸王硬上弓什么意思helloaicloud.com
射手座属于什么象星座hcv9jop1ns7r.cn 蚂蚁长什么样子hcv8jop5ns1r.cn 做头发是什么意思hcv7jop4ns7r.cn 炸鱼是什么意思hcv9jop5ns5r.cn 毛囊炎吃什么药最有效jinxinzhichuang.com
处女什么意思hcv9jop0ns0r.cn 小叶紫檀五行属什么hcv8jop6ns4r.cn 补休是什么意思bysq.com 1988年什么命hcv7jop9ns3r.cn 什么是黄体酮hcv8jop8ns8r.cn
百度