一、配置 Groovy 环境

在 cmd 中,运行 groovy -v,如果打印 groovy 版本信息,则说明配置正确。此外 groovy 自带了编辑器(方便运行一些 snippets,当然最后可以另存为 .groovy,然后可以通过 groovy xxx.groovy 运行),可通过命令启动。如下:

在 IntelliJ IDEA 中创建 groovy 工程:

IDEA 自带对 groovy 的支持,可以直接选择 Groovy 类型的工程,如下:

新建工程后,在 src 目录下编辑 Groovy 脚本:

二、基础语法

1、语言简介:

  1. 是一种基于 Java 虚拟机的动态语言
  2. 基础语法和 Java 类似
  3. 能够调用已存在的 Java 类库
  4. Groovy 可以作为脚本语言来运行,也可以被编译为 Java 的字节码
  5. 如果仅仅在 Gradle 中使用 Groovy,只需要了解一些基本的 Groovy 知识
  6. 在 Groovy 中可以混写 Java 代码和 Groovy 知识。并且,如果不了解 Groovy 语法,完全可以只写 Java 代码

2、与 Java 的区别:

  1. 表达式后面的分号可省略(一般是省略)
  2. 缺省情况下,构造函数和方法都是 public 的(Java 默认是 package)
  3. 方法中的 return 语句可选,最后一个表达式的值作为返回值
  4. 编译器自动为属性添加 getter 和 setter 方法。并且可以直接使用属性名来访问属性,但底层还是调用 getter 和 setter(当然 getter 和 setter 可显式声明,自定义)
  5. 当调用 == 来比较两个对象,底层会自动调用 equals 方法
  6. Groovy 非空为真,而 Java 未采用

3、断言:assert 可用作前置或后置条件的检查,当检查条件不符合时,程序终止运行,并提示错误。Groovy 的断言和 Java 类似,并且运行时不需要指定 -ea 参数。

4、变量类型:

  • Groovy 不强制要求申明变量类型,即可以使用 def 关键字定义变量(弱类型)。也可以作为强类型语言使用
  • 注意:类比于 JavaScript 中的 var,但不同的是 Groovy 不指定变量类型,在赋值之前,变量为 Object 类型。好像现在 Java10 也支持 var 了
  • 未赋值之前,变量值为 null
  • 当为变量赋值之时,变量的类型才确定(使用 var,则为弱类型语言,类型可改变)
  • 方法的参数、返回值类型同理

5、运算符:三目运算符 & Elvis 运算符:

//最开始
def name = 'a'
def test = name != null ? name : 'b'
//Groovy 支持非空为真
name = 'a'
test = name ? name : 'b'
//为了“不重复”,才有了 Elvis 运算符
name = 'a'
test = name ?: 'b'

6、参数列表括号:当函数有参数时,可以省略括号。如:func(val1, val2),等价于 func val1, val2。

7、字符串:

单引号字符串:和 Java 的 String 等效
双引号字符串:是一种新的字符串类型,称为 GString:可以在字符串中使用 $ 符号引用变量;可以使用 ${} 计算表达式的值。这带来了很多便捷
三引号字符串:可以保持格式,比如跨多行

8、List 集合:

  • 默认使用 Java 的 ArrayList
  • 使用方括号 [] 表示 List,值用逗号分隔
  • 使用 << 运算符向最后添加一个元素
  • 却可以使用数组化方式访问元素
  • 使用 each 方法, lambda 作为参数,来遍历元素(好像不是 lambda,而是闭包)
  • 其余方法和 Java 是类似的

9、Map 集合:

  • 默认使用 Java 的 LinkedHashMap
  • 使用方括号表示 Map,值用逗号分隔。与 List 的区别在于:值为键值对,如 ['name1': 'value1', 'name2': 'value2']
  • 通过为 new Key 赋值,添加新的元素,如 map[newKey] = value
  • 可以使用点号访问键值对,如 map.key,可以使用数组下标方式访问 key
  • 使用 each 方法遍历元素,元素为键和值

例程(个人觉得,因为 Groovy 是脚本语言吧,所以可以不在类中,而是直接运行一些 "语法糖" ):

10、接下来就是比较帅气、也相对重要的部分了——闭包 Closure:

  • Groovy 中的闭包是一块代码(类似于 lambda 表达式。个人感觉就是把 lambda 包起来了)
  • 可以赋值给变量、作为参数传递、像普通的方法被调用
  • 闭包的类型是 groovy.lang.Closure
  • 无参的闭包默认包含一个叫 it 的参数(隐式参数):闭包本身没有参数,但是调用时,it 代表传进来的第一个参数;如果调用时没有提供参数,那么 it 的值为 null
  • 闭包总有一个返回值:如果没有显示使用 return 语句,而且最后一个表达式没有值,那么返回 null

例如:

def closure = { key, value ->
println value
}

委托:简言之,就是被委托者,可以使用管理委托者吧。不过暂时用不着,以后再更新。

好嘛,我就是还没搞懂。在老师的例程中,完全没看出委托的作用,不过师傅领进门足矣。由于见识浅薄,对委托也无法熟练应用,等需要了、学会了,再记录。可能学过设计模式就能懂了吧(剑23,嘿嘿)。

Groovy 语法学习的更多相关文章

  1. Groovy语言学习--语法基础(5)

    至此groovy语言学习-语法基础就结束了,新的工作已经安排下来,要干活了. 对groovy了解到一定程度之后就可以在java项目中对其进行引入了.为此新建了一个微型的项目,个人觉得千言万语不如代码实 ...

  2. Groovy语言学习--语法基础(1)

    2018年11月末,从上家公司离职后进入现在的公司.进入项目以来,发现项目中有很多groovy脚本,以前没接触过groovy,抽时间系统地学一下,也方便后期项目的开发和维护. groovy和java的 ...

  3. Gradle系列之一 Groovy语法精讲

    Gradle技术之一 Groovy语法精讲 gradle脚本是基于groovy语言开发的,想要学好gradle必须先要对groovy有一个基本的认识 1. Groovy特点 groovy是一种DSL语 ...

  4. Golang 语法学习笔记

    Golang 语法学习笔记 包.变量和函数. 包 每个 Go 程序都是由包组成的. 程序运行的入口是包 main. 包名与导入路径的最后一个目录一致."math/rand" 包由 ...

  5. Swift高级语法学习总结(转)

    Swift高级语法学习总结 1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如果有参数和返回值直接写在两个括号里就可以了 1.2 参 ...

  6. Swift基础语法学习总结(转)

    Swift基础语法学习总结 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...

  7. Swift高级语法学习总结

    Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如 ...

  8. Swift基础语法学习总结

    Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...

  9. Robot Framework语法学习(一)

    Robot Framework语法学习: 一.变量的声明.赋值与使用 1.变量标识符:每个变量都可以用  变量标识符 ${变量名} 来表示. 2.变量声明:可以在TestSuite上点右键或者在Edi ...

随机推荐

  1. Spark DateType cast 踩坑

    前言 在平时的 Spark 处理中常常会有把一个如 2012-12-12 这样的 date 类型转换成一个 long 的 Unix time 然后进行计算的需求.下面是一段示例代码: val sche ...

  2. 学习animation、transition、transform和@keyframes的使用

    当我们需要给页面添加动画效果时,需要用到CSS3的animation样式属性: 例如: animation: test 2s infinite; 其中test是动画的名称,2s是动画的时长,infin ...

  3. Oracle debug

    执行慢的使用使用debug环境变量,可以收集详细的日志 rootcrs.pl/roothas.pl执行慢 参考如下文档设置debug环境变量,重现问题并收集详细日志. How to turn on r ...

  4. C# 按不同的字节编码,通过字节数去截取字符串

    /// <summary> /// 按不同的字节编码,通过字节数去截取字符串 /// 数据库UTF-8 1个数字.字母.英文符号算1个长度 1个中文.中文符号算3个长度 /// </ ...

  5. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(二)

    接着第一篇的写: 第三步,测试SQL Server数据库的性能: a.加载JDBC SQL Server驱动.添加线程组和设置线程属性和第二步一样,就不再赘述了: b.设置JDBC Connectio ...

  6. node概述

    1.什么是node:“一个搭建在Chrome JavaScript运行时 上的平台,用于构建高速.可伸缩的网络程序.Node.js采用的事件驱动.非阻塞I/O模型,使它 既轻量又高效,并成为构建运行在 ...

  7. 记一次ORACLE无法启动登陆事故

    打开XSHELL 登陆ORACLE用户 1.sqlplus scott/scott 提示登陆失败 2.sqplus / as sysdba 启动数据库提示 3.查找日志 操作日志:$ORACLE_HO ...

  8. 安装jar包到本地仓库和远程仓库

    转载: https://blog.csdn.net/zengdongwen/article/details/81241198 如何部署到maven中央仓库呢? https://blog.csdn.ne ...

  9. 漫谈GUI开发—各种平台UI开发概况

    前言: 在看这边文章前,可以建议看下:图形界面操作系统发展史——计算机界面发展历史回顾 从CS到BS,现在的前端开发,其实也是GUI开发范畴.现今 各平台的UI开发概况 HTML&CSS,Wi ...

  10. PPTP支持IPv6

    pptp支持ipv6,谷歌资料不多,这里整理下   主要用来给ipv4访问ipv6资源的场景使用,客户端连接上pptp后会分配得到一个ipv6地址,通过此地址访问ipv6的资源 客户端网段在pptp. ...