为什么80%的码农都做不了架构师?>>>   

首先感谢翻译《Groovy in Action》Part 1的吴翊,其次感谢Groovy之父James Strachan

本文基于Groovy 1.8。

======== 分割线 开始于2014-12-1 ========

1,Groovy开始运行

Groovy定义和特性:

是一个基于Java虚拟机的敏捷动态语言。
构建在强大的Java语言之上 并添加了从Python,Ruby和Smalltalk等语言中学到的诸多特征。
为Java开发者提供了现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
支持DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让你的代码变得易于阅读和维护。
Goovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变的非常简单。
在开发Web,GUI,数据库或控制台程序时 通过减少框架性代码 大大提高了开发者的效率。
支持单元测试和模拟(对象),可以简化测试。
无缝集成 所有已经存在的 Java对象和类库。
直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。

举例,通过groovy控制台,输入如下代码来输出当前目录下所有的文件名(递归):

groovy -e "new File('.').eachFileRecurse { println it }" // -e 直接执行

和相同功能的java类相比,效率高低立见。

运行groovy的3种方式:

  1. groovysh:脚本命令行REPL
  2. groovyConsole:开启GUI交互界面,上面是脚本编辑区,下半部分是输出,运行快捷键Ctrl + r
  3. groovy:执行脚本文件,可带参数

举例,执行groovy脚本:

// Fibonacci.groovy
current = 1
next = 1
10.times { //循环10次 print current + ' ' newCurrent = next next = next + current current = newCurrent
}
println ''
groovy Fibonacci
===>1 1 2 3 5 8 13 21 34 55

2,语法基础

#!/usr/bin/groovy
/*BookTest.groovy多行注释 不要命名成Book.groovy,报错:
One of the classes is an explicit generated class using the class statement,
the other is a class generated from the script body based on the file name.
*/
class Book{String title
}
def groovyBook = new Book()groovyBook.title = 'GIA'
assert groovyBook.title == 'GIA' // 单行注释 断言当前值equal(),非引用// 引号中的串是GString类型,能作占位符
def nick = 'Gina'
def book = 'Groovy in Action'
assert "$nick is $book" == 'Gina is Groovy in Action'// =~表示匹配,/正则表达式/
assert 'a12345' =~ /\d+/ // 所有的值都是对象
def x = 1
assert x + 2 == 3
assert x instanceof Integer// 简化集合操作
def roman = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII']
roman[8] = 'VIII'
assert roman.size() == 9 // 实是List,能自动扩容
assert roman instanceof List
def y = 1..<10 // range形式,从1起,到10止,不包括10
assert y.contains(10) == false
assert y.size() == 9
assert y.from == 1
assert y.to == 9
assert y.reverse() == 9..1
assert y instanceof Listdef http = [100 : 'CONTINUE',200 : 'OK',400 : 'BAD REQUEST' ]
assert http[200] == 'OK' // 实是Map,冒号区分KV,通过下标Key找配对的Value
assert http instanceof Map

3,闭包Closure

泛用于函数式语言,类Lambda,使代码块被当成数据来引用执行,典型应用是回调函数,用{}包围,如果没有return,则闭包内的最后一行代码就是返回值。

/*ClosrueTest.groovy闭包举例
*/
[1, 2, 3].each{entry -> println entry} // 枚举打印log = ''
(1..10).each{ log += it } // 闭包参数隐式参数
assert log == '12345678910'map = ['a':1, 'b':2]
def doubleMethod (entry) {map[entry.key] = entry.value *2
}
doubler = this.&doubleMethod // 应用方法作为闭包
map.each(doubler)
assert map == ['a':2, 'b':4]

4,结构控制

if (null){ // 非null为真assert false
}else{assert true
}def clinks = 0
for (remainingGuests in 0..9) { // range迭代clinks += remainingGuests
}
assert clinks == (10*9)/2def age = 36
switch(age){    // range casecase 16..20 : rate = 0.5 ; breakcase 21..60 : rate = 0.7 ; breakdefault : rate = 0
}
assert rate == 0.7

5,数据类型

Groovy中所有数据都是对象。

5.1,数字

  • 整数默认为Integer,小数点默认为BigDecimal;
  • 数值类型间自动转换包装;
  • 1 + 1 实质是1.plus(1)的简写;
def store = ''
0.step(10, 2) { num -> // 数字自带糖,如步进store += num + ' '
}
assert store == '0 2 4 6 8 '

5.2,字符串GString

comm = '''line 1
line 2
line 3'''
println comm // 三组引号表示多行文本zz = /\d+/
println zz // 以/起止的串内容不转义,多用于正则表达式date = new Date()
out = "Date is ${date.toGMTString()}!" // 变量作为模板占位符的完整写法,好东西
println out
out.strings.each{entry -> println entry}
out.values.each{entry -> println entry} // 实际是混合的,动态部分独立println 'x'.padLeft(3)
println 'x'.center(3)
println 'x' * 3 // 各种糖 greeting = 'Hello'
greeting <<= ' Groovy'
greeting[1..4] = 'i' // 追加&替换
assert greeting instanceof java.lang.StringBuffer
println greeting

5.3,正则表达式

greeting = 'sunshine beach beauty'
assert greeting =~ /b.a/ // 含有以s开头、n结尾的3位字符finder = (greeting =~ /b.a/)
assert finder instanceof java.util.regex.Matcherword = /\w+/
matches = (greeting ==~ /($word $word)*/)  // 有否有空格包围的词组,boolean
println matchesfound = ''
finder.each{ match ->  // 匹配结果传递给闭包 found += match + ' '
}
println found

5.4,集合容器

mylist = ['a', 'b', 'c', 'd', 'e']
assert mylist[0..2] == ['a', 'b', 'c'] // getAtmylist[0,4] = ['x', 'y']
assert mylist == ['x', 'b', 'c', 'd', 'y'] // putAtmylist[1..3] = []
assert mylist == ['x', 'y'] // removeprintln mylist[-1] // 负数逆向索引mylist += ['z']  assert mylist == ['x', 'y', 'z'] // plus
assert mylist.isCase('x') // 用于switch
assert ['a', 'b', 'x'].grep(mylist) == ['x'] // 过滤,不能直接print
assert ['a', 'b', 'x'].intersect(mylist) == ['x'] // 交集
assert ['a', 'b'].disjoint(mylist) // 非交判定
println mylist.pop() // 堆弹出if ([]) assert false // 空集合为假def list = [[1, 0], [0,1,2]]
list = list.sort {a,b -> a[0] <=> b[0]} // 首元素对比排序
println list def quickSoft(list) {    // 快速排序算法if (list.size() < 2) return listdef pivot = list[list.size().intdiv(2)]def left = list.findAll {item -> item < pivot}def middle = list.findAll {item -> item == pivot}def right =  list.findAll {item -> item > pivot} return (quickSoft(left) + middle + quickSoft(right))
}
assert quickSoft([2,8,4,7,6,3]) == [2, 3, 4, 6, 7, 8]def emptymap = [:]
assert emptymap instanceof Map
mymap = ['a.b':1] // 带符号的key用引号定界
assert mymap.'a.b' == 1store = ''
mymap.each {key, value -> // 闭包带2个参,自动配对kvstore += keystore += value
}
assert store.contains('a.b1') 

6,面向对象

// SomeClass.groovy
class SomeClass {static main(argv) {def some = new SomeClass()some.publicVoidMethod()assert 'hi' == some.publicUntypedMethod()combinedMethod()}void publicVoidMethod(){}def publicUntypedMethod() {return 'hi'}protected static final void combinedMethod () {}
}

========分割线 结束于 2014-12-8 ========

本来还想补充《Groovy入门经典》的部分,实在没空,以上这些基本够用,除了对象部分有点不足,后期coding在慢慢体验动态脚本语言的优劣,后面准备攻略Grails

转载于:https://my.oschina.net/yygh/blog/350776

Groovy学习摘要相关推荐

  1. JUnit学习摘要+入门实例 (junit4)

    http://www.cnblogs.com/xwdreamer/archive/2012/03/29/2423136.html 1.学习摘要 看<重构-改善既有代码的设计>这本书的时候, ...

  2. groovy学习笔记 - 目录

    groovy学习笔记(01)- 安装与运行 关键字:groovyConsole groovy学习笔记(02)- 数据类型与作用域 关键字:times,upto,downto,step,GString( ...

  3. 【神经网络与深度学习摘要】第1章 绪论

    [神经网络与深度学习摘要]第1章 绪论 文章目录 [神经网络与深度学习摘要]第1章 绪论 1.人工智能 1.1 图灵测试 1.2 人工智能的主要领域 1.3人工智能的发展历史 1.4 人工智能的流派 ...

  4. 关于优化排名,搜索引擎,站内优化的学习摘要

    关于优化排名,搜索引擎,站内优化的学习摘要 你的排名你说了算,学习笔记摘要: 优化排名,不同的人员操作效果不一样,关键词排名行情是变量的,对与不同的网站在操作方式要非常慎重,让你的排名你说了算,掌握专 ...

  5. Groovy学习专栏

    今天新开了一个groovy的学习专栏,因为最近工作中会用到Groovy模板. 然后就是在网上找了一下Groovy模板相关的东西发现ibm中在2005年就有讲到这个的,我勒个去,这么早,我初中都还没毕业 ...

  6. ACL 2021 | SimCLS: 概念简单但足够有效的对比学习摘要生成框架

    ©PaperWeekly 原创 · 作者 | Maple小七 学校 | 北京邮电大学硕士生 研究方向 | 自然语言处理 作者提出了一个概念简单但足够有效的摘要生成框架:SimCLS,在当前的 SOTA ...

  7. 高性能Web动画和渲染原理系列(4)“Compositor-Pipeline演讲PPT”学习摘要【华为云技术分享】

    [摘要] 学习chromium对合成层的处理 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 附 ...

  8. Groovy学习()面向Java开发者的Groovy

    第一段Groovy代码 // first groovy program for(int i = 0; i < 3; i++) {System.out.println("ho " ...

  9. groovy学习(一)

    目录 1. task的声明 2. 基本使用 3. 字符串使用 4. 变量:def关键字 5. 集合 6. Map的使用 7. Groovy 类 8. 方法 9. 闭包 1. groovy简介 Grad ...

最新文章

  1. C#在WinFrom中Get/Post请求及QQ农场Cookie保存
  2. Judge Route Circle
  3. static和不完全类型的一个例子
  4. 初识Mysql(part1)--我需要知道的基本概念
  5. Prototype模式
  6. oracle clob截取_Oracle数据库设计规范建议
  7. 突变检测软件 测试数据库,测序数据比对和变异检测
  8. java摄像头推流,流媒体服务 javaCV-2 推流
  9. 【CentOS】Centos下pip的安装
  10. 从机器学习谈起 (转)
  11. Matlab 2016a 安装教程【转】
  12. 软件开发的心得体会(一)
  13. stata--异方差检验
  14. 组合模式中的“整体与部分”你真的清楚吗?
  15. mysql standby_数据库的 standby模式
  16. MySQL锁 —— 记录锁、间隙锁、临键锁、自增锁
  17. 净化网络环境 ASP程序实现过滤脏话
  18. maven dependency的作用英文解释(转载)
  19. db2 ? 22018
  20. ESD静电保护二极管的优点有哪些?

热门文章

  1. 【Python】keras使用LSTM拟合曲线
  2. 线程安全的Generic Dictionary
  3. 2015年度打榜之数据备份硬件
  4. 我在家乡写代码(一)
  5. Android系统如何管理自己内存的?
  6. 集群 之 LVS + Keepalived
  7. 深入讲解MPLS/×××技术原理
  8. 13 个mod_rewrite 应用举例
  9. Openssl生成证书流程
  10. 关于 top、left 结合 translate 实现居中的原理探讨