Groovy快速入门
来源:互联网 发布:js bind()方法 编辑:程序博客网 时间:2024/06/05 08:27
Groovy简介
Groovy
是基于Java
平台开发的一门强大的、具有Optional
类型,多功能性的动态语言,它具有静态类型和静态编译的功能。为了提高在java
平台的开发效率,它的语法设计的很简洁,易学。和java
无缝集成,从而使自己的项目具有强大的特性,比如脚本功能、DSL(Domain-Specific Language)
语言编写,运行时和编译时元编程(meta-programming)
以及函数式编程。
Groovy优势
- 语法简洁,可读性强,并且很容易上手
- 功能强大,具有闭包特性,自动构建,元编程,函数式编程,
Optional
类型以及静态编译的功能 - 集成性强,与
Java
语言或者一些第三方库无缝接入 DSL
语言编写,语法灵活,扩展性强,使项目具有高级配置与可定制的机制,可读性强的特点- 完整的生态系统,涉及
Web
开发、reactive
应用,并发性、异步的库、测试框架、构建工具(Build Tools)
、代码分析、GUI
构建 - 脚本测试,可以写一些简单的、可维护的测试用例,来完成自动化构建任务
安装Groovy
Groovy下载链接
下载后,把压缩包解压到相应的位置,然后再环境变量的Path
里面添加解压后的路径(到解压的bin目录下)。配置好后,然后运行groovy -v
,可以看到如下图
到这里,就安装好了。
Groovy IDE
Hello Groovy
运行groovyconsole
之后,稍等,可以看到启动的Groovy
自带的编辑器。输入第一句代码:
- 1
然后按CTR+R
就可以得到如下输出
- 1
- 2
- 3
或者我们save as
到一个相应的位置保存为hello.groovy
,然后cd
到相应的目录下面,运行groovy hello.groovy
,得到结果也一样,如下图
Java&Groovy不同点
- 默认含有
import
,引入包无须在前面再申明import
,比如java.io.*
,java.lang.*
等等 - 方法多元化
(Multi-methods)
,Groovy
的参数类型决定于代码运行时,Java
正好相反,Java
参数类型决定于编译时,主要用申明的类型决定。比如举个例子Hello.groovy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
输出结果为
- 1
Hello.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
输出结果为
- Array初始化
java
初始化一个Array
,一般是这样
- 1
但是在Groovy
里面{...}
代表的是一个闭包(closures)
,所以Groovy
不能和Java
这样申明。我们应该这样申明
- 1
包范围可视性
比如一个类
- 1
- 2
- 3
在
Groovy
里面,没有可视化修饰符的属性,都是公有的,并且会生成getter
和setter
方法。如果要私有化这个属性,可以加注解@PackageScope
,如下
- 1
- 2
- 3
- ARM 块
ARM(Automatic Resource Management)
自动化资源管理,在Java7
开始引入,但是Groovy
不支持,所以Groovy
通过闭包的形式提供了各种各样的依赖方法来替换,实现效果是一样的。比如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
可以写成:
- 1
- 2
- 3
或者写成和上面Java
版本更像的代码:
- 1
- 2
- 3
- 4
- 5
- 内部类
Groovy
的匿名内部类和内嵌类和Java
的实现方式是一样的,但是Groovy
不支持y.new X()
这种实现方式,需要使用 new X(y),如下Java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Groovy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- Lambda 表达式
Java8
是支持Lambda
表达式的,比如
- 1
- 2
但是Groovy
是不支持,取而代之的是使用闭包实现的一样的效果
- 1
- 2
- GStrings
在Java
里面字符串是"xxxxx"
这样的形式,但是在Groovy
里面这种形式叫GString(Groovy String)
或者String
类型,当使用($)
符号引用类型是,它会自动转换为GString
类型,反之,为String
类型。
字符串和字符字面量
当使用'xxx'
形式使用的时候,它的类型为字符串(String)
,当使用"xxx"
的时候,参考上面GString
说明基本类型和封装性
由于Groovy
一切类型皆对象,所以它会自动把基本类型封装成对象,这一点和Java
规范不同,比如
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如果是Java
,自然会去执行方法1,但是Groovy
则会执行方法2
- ==的不同
在Java
中==
指的是基本类型相等或者是对象的引用相等,但是在Groovy
中,Java
的==
含义转换为a.compareTo(b)==0
,如果两边都实现了Comparable
接口的话,而Groovy
的==
的含义指的是a.equals(b)
,对象引用是否相等,则是使用a.is(b)
- 转换
java
的自动转换只能向下转换,Groovy
则进行相应的扩展,具体如下
Y
表示 Groovy
可以执行的转换。D
表示的是在动态编译或显式转换时 Groovy
能够执行的转换。T
表示 Groovy
可以执行的转换,但数据被截断了。B
表示装箱/拆箱操作。N
表示Groovy
不能实行的转换。
- 扩展的关键字
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Groovy开发套件
IO操作
Groovy
提供了一些IO
操作的帮助类,这里提供几个常用的API
1. java.io.File
2. java.io.InputStream
3. java.io.OutputStream
4. java.io.Reader
5. java.io.Writer
6. java.nio.file.Path
- 读文件
通过Groovy
读取文件很简单,举个例子,先在E:/Android/Groovy/workspace
目录下创建一个read.txt
文件,然后编写代码
- 1
- 2
- 3
File
对象有两个参数,一个是文件的路径,一个是文件的文件名,然后eachLine
方法就可以读取到文件内容
- 1
其实,在File
的API
里面还可以查到eachLine
还有很多个参数
在Groovy
里面,使用IO
操作,即使代码出现异常,IO
读取流也会保证会被关闭。比如
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 写文件
- 1
- 2
- 3
在相应的位置就可以找到write.txt
,然后内容为
- 1
- 2
- 3
集合
List操作
- 取元素
def emptyList = []//空List
def list = [1,5,7,8]
list.get[2] = 7
list.getAt(2) = 7
list[2] = 7
list[-2] = 7
list[1..2] = [5,7]
list[1..<7] = [5,7]
- 迭代元素
- 1
- 2
- 3
- 1
- 2
- 3
- 4
Groovy
映射功能,通过collect
从当前集合映射到另个集合
- 1
- 2
- 3
- 4
- 5
输出
- 1
- 2
- 3
- 4
- 过滤和搜索
list.find{it>5} == 7
list.findAll{it>5} == [7,8]
通过一个list
去搜索匹配
- 1
- 2
- 3
['a','b','c','d','e'].indexOf('c') == 2
['a', 'b', 'c', 'd', 'c'].indexOf('k') == -1//list不存在元素则返回-1
['a', 'b', 'c', 'd', 'd'].lastIndexOf('c') == 4
[1, 6, 3].every { it < 5 } == false//集合所有元素小于5则返回true
[1, 2, 4].any { it > 3 } //集合任何一个元素大于3则返回true
[1, 2, 3, 4, 5, 6].sum() == 21//求和
[1, 2, 3].join('-') == '1-2-3'//加入间隔符并转换为String
- 1
- 2
- 3
[1, 2, 3].max() = 3
[1,2,3].min() = 1
- 添加和删除元素
[1, 2, 4] << 5 == [1,2,4,5]
[1, 2, 4] << 5 << 7 << 8 == [1, 2, 4, 5, 7, 8]
[1, 2, 4] << [5,8] == [1, 2, 4, [5, 8]]
[1, 2] + 3 + [4, 5] + 6 == [1, 2, 3, 4, 5, 6]
[1, [2, 3, [4, 5], 6], 7, [8, 9]].flatten() == [1, 2, 3, 4, 5, 6, 7, 8, 9]
['a','b','c','b','b'] - 'c' == ['a','b','b','b']
- 排序 [6, 3, 9, 2, 7, 1, 5].sort() == [1, 2, 3, 5, 6, 7, 9]
- 复制元素 [1, 2, 3] * 3 == [1, 2, 3, 1, 2, 3, 1, 2, 3]
[1, 2, 3].multiply(2) == [1, 2, 3, 1, 2, 3]
Collections.nCopies(3, 'b') == ['b', 'b', 'b']
Map操作
其中Map
操作和List
操作的方法差不多,只不过Map
是通过获取key
来操作的,而List
是通过index获取,这点和Java
里面的集合操作是一样的
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
ConfigSlurper
ConfigSlurper
是Groovy
里面一个读取配置文件的帮助类,和Java *.properties
一样。ConfigSlurper
允许使用.
或者以闭包的形式配置值得作用域和任意的对象类型,比如
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
输出为:
- 1
上面的的字符串我们也可以用文件形式读取,比如
- 1
MOP
Groovy
也具有元对象协议的特性(Meta Object Protocol,MOP)
,实现这个特性,有个很重要的类就是groovy.lang.GroovyObject
。基本上Groovy
的对象都直接或者间接的实现了它。GroovyObject
有两个很重要的方法invokeMethod()
和getProperty()
,当一个对象调用一个方法或者属性的时候,而这个方法或者属性不存在的时候,这两个方法就会被调用。比如
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
输出为
- 1
- 2
- 3
当这个方法不存在的时候,它就会进行拦截,然后智能的输出响应的对象。同时会调用methodMissing
这个方法
类
- 添加方法
当为一个类添加方法的时候,一般可以使用<<
或者=
运算符来添加方法,比如
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 添加属性
- 1
- 构造函数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 静态方法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 间接调用方法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 动态方法名称
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Groovy
更多的使用方法,例如AST
转换,Grape
的依赖,写一些测试用例,DSL
语言以及Groovy
在Java
里面的常用方法可以参考官网,由于篇幅的原因,入门的简单学习就暂时到此为止。
参考文献
Groovy官网
Groovy1.6的新特性
Groovy入门
实战Groovy
原文地址:http://blog.csdn.net/Iamzgx/article/details/72972255
- Groovy快速入门
- groovy快速入门
- Groovy 快速入门
- Groovy快速入门
- Groovy快速入门
- Gradle第九章:Groovy快速入门
- groovy 入门
- Groovy入门
- groovy入门
- Groovy入门
- Gradle 1.12 翻译——第九章 Groovy快速入门
- Gradle 教程说明 用户指南 第9章 Groovy----快速入门
- Gradle 教程说明 用户指南 第9章 Groovy----快速入门
- Gradle详解(一)——Groovy语法快速入门
- Groovy基础入门
- Groovy语言入门(1)
- Groovy入门(2)
- Groovy入门以及配置
- php后台无法保存emoji表情
- 第7章 模式匹配与正则表达式
- linux下用Kazam录屏视频在windows不能播放解决
- 手把手教你搭建AI开发环境 !(附代码、下载地址)
- validate使用笔记
- Groovy快速入门
- NIFI 系统属性 System Properties之Core Properties
- tensorflow+python MNIST数据抽样可视化+前向运算过程
- cas 4.0 返回更多信息
- 排序遍历带前缀的文件名
- 100ITJAVA面试必考题系列(一)
- Android 6.0 动态权限申请
- 《机器学习实战》第三章 3.1 决策树的构造
- 干就完事了 setContentView()探秘一