Groovy 学习手册(1)
1. 需要安装的软件
Java / Groovy
对应 Java 和 Groovy,你需要安装以下软件:
下载以后,安装即可。接下来需要配置 Java_Home
和 Groovy_Home
环境变量。如下(以 Mac为例):
- 在你的用户根目录下,使用命令
ls -a
找到.bash_profile
文件,注意,它是一个隐藏文件,而且对它的修改只对当前用户生效。 - 使用 vi 命令,
vi .bash_profile
打开此文件,并进入编辑状态,
- 修改完成保存退出,在命令行窗口执行使修改生效:
. .bash_profile
- 测试 JDK 是否配置正确。在命令行中输入
java -version
,回车,出现以下信息:
- 测试 Groovy 是否配置正确。在命令行中输入
groovyConsole
并回车,
至此,开发环境已经完成。
2. Groovy 是什么?
Groovy 是基于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。支持闭包,多重继承,元编程等很多特性。
紧凑的语法
Groovy 的语法比 Java 语法更加紧凑简洁,例如下面的例子,分别用 Java 和 Groovy 来实现。
Java 版本:
for (String it : new String[] { "Rod", "Carlos", "Chris" }) {
if (it.length() < 4) {
System.out.println(it); // print Rod
}
}
Groovy 版本:
["Rod", "Carlos", "Chris"].findAll{it.size() < 4}.each{println it}
动态定义
Groovy 一个重要的特性就是可以使用 def 关键字来定义动态类型,你可以用 def 来定义任何类型的变量。
List 和 Map 的定义
在 Groovy 中 List 和 Map 的定义和使用更加简洁和简单,只需使用 [] 即可,Map 中的键值对使用“:” 来表示。
def list = [1, 2]
def map = [cars: 2, boats: 3]
println list.getClass()
println map.getClass()
默认情况下,Map 的 key 如果不带引号的话,默认就是字符串类型,这样用起来就非常方便:
map.cars = 20
map.botst = 30
map.planes = 50
print map.cars
在 Groovy 里甚至可以重载了“<<”运算符,用来向 list 中添加元素:
list.add("Hello")
list << "World"
list += "!"
println list
Groovy GDK
内置的 Groovy 类型(GDK)很多地方跟 Java 是很相像的,但是 GDK为每个类增加了很多方法。
使用 each 方法来迭代集合里的元素:
["Java", "Groovy", "Scala"].each{ println it }
这里的println
是System.out
的简写。
万物皆对象
跟Java 不一样,基本类型的变量在 Groovy 里面也会被当做一个对象来对待,跟其他的对象没有区别。例如,下面的例子,打印100次"hi"字符串:
100.times{print "hi"}
属性的快速访问
Groovy 对 Java Bean 的操作有了新的想法,你可以使用"." 对其属性进行操作来代替繁琐的 getter 和 setter 操作。
例如,
// Java style
person.setName("Jim")
person.getName()
// Groovy style
person.name = "Jim"
Person.name
Tip
这里需要注意的是,Groovy 的默认的访问修饰符为 public。
当然,你还可以使用println person.properties
来打印对象的所有属性。太贴心了。
GString 类型
Groovy 自己新增了此类型,目的用来在字符串里嵌入 Groovy 本身的代码。GString每次使用时要有双引号来创建。
def os = 'Linux'
def cores = 2
println("Cores: $cores, OS: $os, Time: ${new Date()}")
这里的\(可以直接引用一个变量,而\){code}则可以直接在 GString 类型里写 Groovy 代码。
Tip
如果你想使用java.lang.String,则使用单引号('')。
闭包
在 Groovy 里面,闭包就是一个代码块,它即可以有参数,有返回值,当当然,也可以没有。其实,它就像 Java8 里的 Lambda 表达式,或者是内部类的一个方法。闭包在有很多有用的方式,例如用在findAll
方法中,each
方法中,times
方法中。
Groovy 闭包里有些隐性的变量:
- it——如果闭包里有参数,则 it 就隐形地指向这个参数;
- this——指向被包含的类;
- owner——如果闭包里没有包含另外的闭包的话,跟 this 是一样的;
- delegate——通常情况下,跟 owner 是一样的,但是你可以修改它。
闭包可以作为方法的参数来传递,当 this 已经完成(它是最后一个参数),闭包就会从括号里走出来,例如,当你使用“collect”方法时,这个方法用来在闭包里把一个List 转换成一个新的 List,看下面的例子:
def alist = ['foo', 'bar']
def newList = []
alist.collect(newList) {it.toUpperCase()}
println newList // ["FOO", "BAR"]
Tip
return 关键字在 Groovy 里完全是可选的,一个方法或闭包会返回最后一个表达式的类型,你也可以把闭包赋给一个变量,在稍后调用。
def closr = {x -> x + 1}
println( closr(2) ) // prints 3
更加好用的 switch 语句
Groovy 里的 switch 语句用法与 Java 里基本一样,但是它允许更多了的类型,例如,除了字符串,还可以是 List,一个范围区间,一个Class 类型。
def x = 42
switch ( x ) {
case "foo":
result = "found foo"
break
case [4, 5, 6]:
result = "4 5 or 6"
break
case 12..30: // Range
result = "12 to 30"
break
case Integer:
result = "was integer"
break
case Number:
result = "was number"
break
default:
result = "default"
}
元编程
在 Groovy 中,你可以为正在运行中的对象添加方法,甚至是 Java 核心库里的对象。例如,下面的代码给String 类添加了 upper 方法。
String.metaClass.upper = { -> toUpperCase() }
或者对一个实例添加 upper 方法:
def str = "test"
str.metaClass.upper = { -> toUpperCase() }
静态类型检查
如果你在类里使用 @TypeChecked注解,则编译器就会强制在运行期间做类型检查,它能为你推理出对应的类型,所以你的代码依旧是 Grooby 的代码。
import groovy.transform.*
@TypeChecked
class Foo {
int i = 42.0 // this does not compile
}
import groovy.transform.*
@TypeChecked
class Foo {
int i = 42 // this works fine
}
new Foo()
Tip
静态类型检查不适用于元编程;
在闭包中要显式指定参数类型:a.collect {String it -> it.toUpperCase()}
如果在类中使用@CompileStatic注解,编译器就会把 Groovy 代码编译为字节码,当在极度强调性能和需要 Java字节码为了别的原因的话,会有用。同时生成的字节码与 Java编译产生的字节码几乎一致。
import groovy.transform.*
@CompileStatic
class Foo {
void getFibs(int count) {
def list = [0, 1] // print first #count Fibonacci numbers
count.times {
print "${list.last()}"
list << list.sum()
list = list.tail()
}
}
}
Tip
@TypeChecke 与def 关键字能很好地在一起工作。
Elvis 运算符
这个运算符产生在 Java 的日常使用中,为变量提供一个默认值,而不像Java 那样繁琐。
String name = person.getName() == null ? "Bob" : person.getName();
// Instead in Groovy you can just use the elvis operator:
String name = person.getName() ?: "Bob"
安全解引用操作符
此操作符用来避免发生空指针异常的情况,只需要在语句里面添加一个问号(?)即可,看例子。
String name = person?.getName()
当 person 为 null 时,对应的name 属性也设置为 Null。同样,对方法调用也同样适用。
Groovy 学习手册(1)的更多相关文章
- Groovy 学习手册(7)
10. Groovy GPars GPars 一开始在 Groovy 中作为一个单独的项目,同时带来了很多并发的机制.它包含了很多并行的map/redue,Actors,以及其他很多并发的模块. 1. ...
- Groovy 学习手册(6)
9. 不可变特性 不可变特性和函数式编程在一起就像是花生酱和果酱在一起一样.虽然没有必要非要在一起使用,但他们相处得很好. 在纯正的函数式语言中,每个函数对本身之外没有影响,即没有副作用.这意味着每次 ...
- Groovy 学习手册(5)
8. 函数式编程 函数式编程(FP)是一种编程风格,侧重于函数和最小化状态的变化(使用不可变的数据结构).它更接近于用数学来表达解决方案,而不是循序渐进的操作. 在函数式编程里,其功能应该是" ...
- Groovy 学习手册(4)
6. 领域特定语言 Groovy 有许多特性,使它非常适合写DSL(领域特定语言).这些特性包活: 具有委托机制的闭包: 点号(.)和语句末尾的分号(;)是可选的: 运算符的重载(例如,加号,减号等) ...
- Groovy 学习手册(3)
五. Groovy 的设计模式 设计模式是一种非常好的方式,可以使你的代码变得实用,可读又具有扩展性.跟 Java 相比,在 Groovy 里使用设计模式使代码更加简洁和容易. 1. 策略模式 设想一 ...
- Groovy 学习手册(2)
二. 工具 1. 控制台 groovyConsole: Groovy 控制台是一个非常易于使用和简单的轻量级的编辑器.你可以在里面做很多事情. 在编辑器里面可以书写代码,Windows 下,按下Ctr ...
- Kotlin强化实战!这份学习手册让你的面试稳如泰山
一.引言 正如官网的slogan所描述:kotlin,是一门让程序员写代码时更有幸福的现代语言. 同时,也正如维基百科里介绍: JetBrains公司希望Kotlin能够推动IntelliJ IDEA ...
- Redis学习手册(目录)
为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...
- git学习手册
#git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...
随机推荐
- Discuz常见小问题-如何批量加精,置顶帖子
批量选中帖子,然后置顶和精华都可以勾选 完成之后的效果
- MSSQL 2005/2008 日志压缩清理方法小结
适用于SQL Server 2005的方法 --------------------------------------------- 复制代码 代码如下: USE DNName GO 1,清理日志 ...
- 获取和设置URL里星号(#)的参数
示例:http://gzmsg.com/go/news.aspx#page=12 var DF = {}; (function () { var a = function () { var d, e ...
- Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to IP1:8020 Invalid volume failure config value: 1
2017-02-27 16:19:44,739 ERROR datanode.DataNode: Initialization failed for Block pool <registerin ...
- 微软BI 之SSAS 系列 - 实现Cube 以及角色扮演维度,度量值格式化和计算成员的创建
在熟悉完下面这三种维度的创建方式之后,就可以开始创建我们的第一个 Cube 了. SSAS 系列 - 自定义的日期维度设计 SSAS 系列 - 基于雪花模型的维度设计 SSAS系列 - 关于父子维度的 ...
- dir for RequestHandler and request
两个对象的dir # RequestHandler ['GET', 'GETPOST', 'POST', 'SUPPORTED_METHODS', '_ARG_DEFAULT', '_INVALID_ ...
- 通过淘宝接口免费获取IP地址信息
1.获取互联网访问IP信息 一般获取互联网访问的IP的相关信息一般都是收费接口,免费的接口不多,我使用到一个接口如下: http://ip.taobao.com/service/getIpInfo.p ...
- MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT...
1:错误日志大量错误 150602 14:40:02 [Warning] Unsafe statement written to the binary log using statement form ...
- sqlserver 日志查看
sqlserve的ErrorLog文件有时候会碰到文件很大的情况,可能通过命令xp_readerrorlog 或 sp_readerrorlog 执行,可以加搜索文本或起止时间 -- 日志查看 --e ...
- Android中怎样做到自己定义的广播仅仅能有指定的app接收
今天没吊事.又去面试了,详细哪家公司就不说了,由于我在之前的blog中注明了那些家公司的名字,结果人家给我私信说我泄露他们的题目.好吧,我错了... 事实上当我们已经在工作的时候.我们能够在空暇的时间 ...