Groovy 是基于 JRE 的脚本语言,和Perl,Python等等脚本语言一样,它能以快速简洁的方式来完成一些工作:如访问数据库,编写单元测试用例,快速实现产品原型等等。
Groovy 是由James Strachan 和 Bob McWhirter 这两位天才发明的(JSR 241 2004 年 3 月)。Groovy 完全以Java API为基础,使用了Java开发人员最熟悉的功能和库。Groovy 的语法近似Java,并吸收了 Ruby 的一些特点,因此 Groovy 在某些场合可以扮演一种 “咖啡伴侣”的角色。
官网地址:http://groovy.codehaus.org/
Groovy的主要特性:
Groovy 可以作为 javac 的一种可选编译器来生成标准的 Java 字节码,在任何 Java 工程 中使用。Groovy 可以作为一种动态的可选语言,如脚本化 Java对 象、模版化、编写单元测试用例。
工具介绍:
使用压缩包安装,下载地址为 http://groovy.codehaus.org/Download,下载然后解压配置环境变量。
在 mac 上安装 groovy:
brew install groovy
Groovy 脚本可以直接用 Groovy 解析执行:
groovy hello.groovy
编译为字节码:
groovyc -d classes hello.groovy
运行编译好的groovy脚本:
java -cp %GROOVY_HOM E%/embeddable/groovy-all.jar;classes hello
你会发现其实就是运行 java 的 class 文件。
Groovy 的语法融合了 Ruby、Python 和 Smalltalk 的一些最有用的功能,同时保留了基于 Java 语言的核心语法。对于Java 开发人员,Groovy 提供了更简单的替代语言,且几乎不需要学习时间。
Groovy在语法上跟java有几点不同:
在 Groovy 可以用 def 定义无类型的变量(定义变量方面 def 与 JavaScript 中的 var 相似),和返回值为无类型的方法
class Man {
def name = "javachen"
def introduce() {
return "I'm $name" // return可以省略
}
}
Groovy的语句和Java类似,但是有一些特殊的地方。例如语句的分号是可选的。如果每行一个语句,就可以省略分号;如果一行上有多个语句,则需要用分号来分隔。
另外return关键字在方法的最后是可选的;同样,返回类型也是可选(缺省是Object)。
调用方法时可以不用括号,只要有参数,并且没有歧义。
一个示例:
package com.javachen.groovy.test
class Hello{
static main(args){
println "hello world"
}
}
和Java一样,程序会从这个类的main方法开始执行,和Java的区别是:
当然,这只是 Groovy 代码的一种写法,实际上执行 Groovy 代码完全可以不必需要一个类或 main 方法,所以更简单的写法如下:
package com.javachen.groovy.test
println "hello world"
将上述代码保存为 hello.groovy,然后运行:
$ groovy hello.groovy
hello world
可以看到正确的输出了 “hello world”
像其他 Script 一样,Groovy 不需要显式声明类型。在 Groovy 中,一个对象的类型是在运行时动态发现的,这极大地减少了要编写的代码数量。
在 Groovy 中,类型对于值(varibles)、属性(properties)、方法(method)和闭包(closure)参数、返回值都是可有可无的,只有在给定值的时候,才会决定它的类型,(当然声明了类型的除外)。
Groovy 对 boolean 类型放宽了限制:
Groovy 中的字符串允许使用双引号和单引号。 当使用双引号时,可以在字符串内嵌入一些运算式,Groovy 允许您使用 与 bash 类似的 ${expression}
语法进行替换。可以在字符串中包含任意的 Groovy 表达式。
大块文本:
如果有一大块文本(例如 HTML 和 XML)不想编码,你可以使用Here-docs。 here-docs 是创建格式化字符串的一种便利机制。它需要类似 Python 的三重引号(“”“)开头,并以三重引号结尾。
package com.javachen.groovy.test
// groovy中对字符串的使用做了大量的简化
// 获取字符串中的字符
s = "Hello"
println s[0] // 输出'H'
// 遍历字符串中的所有字符
s.each {
print it + ", " // 遍历字符串中的所有字符
}
println ""
// 截取字符串
s1 = s[1..3] // 截取s字符串标号从1到3的3个字符,组成新的字符串赋予s1
// 该语法是String类的substring方法的简化
println s1
// 模板式字符串
n = 100
s1 = "The number n is ${n}" // ${n}表示将变量n的值放在字符串该位置
println s1
// 带格式的长字符串
// """和"""之间的所有字符都会被算做字符串内容,包括// /*以及回车,制表符等
s = """
大家好
欢迎大家学习Groovy编程
Groovy is a better Java
"""
println s
// groovy中单引号的作用
// 在不定义类型时,单引号也表示字符串
c1 = 'A'
println c1.getClass().getName()
// 要明确的定义字符类型,需要给变量增加定义
char c2 = 'A'
println c2.getClass().getName()
// 取消转义字符
s = 'c:\\windows\\system'
println s
s = /c:\windows\system/ // 利用/字符串/定义的字符串
println s
// 字符串运算
s = "hello"
s = s + " world" // +运算符用于连接字符串
println s
s -= "world" // -可以从字符串中去掉一部分
println s
s = s * 2 // *可以让字符串重复n次
println s
// 字符串比较
s1 = "Abc"
s2 = "abc"
println s1 == s2 ? "Same" : "Different" // 执行s1.equals(s2)
println s1 != s2 ? "Different" : "Same" // 执行!s1.equals(s2)
println s1 > s2 ? "Great" : "Less" // 执行s1.compareTo(s2) > 0
println s1 < s2 ? "Less" : "Great" // 执行s1.compareTo(s2) < 0
println s1 <=> s2 == 1 ? "Same" : "Different" // 执行s1.compareTo(s2)
Groovy增加了对字符串的如下操作:
Groovy 的 switch 语句兼容 Java 代码,但是更灵活,Groovy 的 switch 语句能够处理各种类型的 switch 值,可以做各种类型的匹配:
Switch 语句的工作原理:switch 语句在做 case 值匹配时,会调用 isCase(switchValue)
方法,Groovy 提供了各种类型,如类,正则表达式、集合等等的重载。可以创建自定义的匹配类,增加 isCase(switchValue)
方法来提供自定义的匹配类型。
package com.javachen.groovy.loops
public class LoopTest{
public static void main(args){
def list = ["Lars", "Ben", "Jack"]
// using a variable assignment
list.each{
firstName->
println firstName
}
// using the it variable
list.each{
println it}
5.times {
println "Times + $it "}
1.upto(3) {
println "Up + $it "}
4.downto(1) {
print "Down + $it "}
def sum = 0
1.upto(100) {
sum += 1}
print sum
(1..6).each {
print "Range $it"}
for (i in 0..9) {
println ("Hello $i")
}
}
}
Groovy对Java循环结构作了如下的修整:
for (i in 1..10)
,表示循环10次,i在1至10之间取值;n.upto(m)
函数,表示循环 m- n 次,并且会有一个循环变量it,从 n 开始,每次循环增加1,直到 m。循环体写在upto方法之后大括号中,表示一个闭包,在闭包中,it 作为循环变量,值从 a 增长到 n;n.times
函数,表示循环 n 次,循环变量 it 从0开始到n结束。n.step(x, y)
函数,表示循环变量从 n 开始到 x 结束,每次循环后循环变量增加 y,所以整个循环次数为 (x - n) / y
次;文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland