个人博客:

http://www.milovetingting.cn

Groovy基础

Groovy是基于JVM虚拟机的一种动态语言。每个Gradle的build脚本文件都是一个Groovy脚本文件。

字符串

在Groovy中,分号不是必需的。在Groovy中,单引号和双引号都可以定义一个字符串变量 ,单引号标记的是纯粹的字符串变量,而不是对字符串里的表达式做运行,但是双引号可以。

task printString {
def str1 = '单引号'
def str2 = "双引号" println "单引号定义的字符串类型:"+str1.getClass().name
println "双引号定义的字符串类型:"+str2.getClass().name
}

输出结果:

单引号定义的字符串类型:java.lang.String
双引号定义的字符串类型:java.lang.String

而双引号可以做运算:

task  printStringVar{
def name = '张三' println '单引号的变量计算:${name}'
println "双引号的变量计算:${name}"
}

输出结果:

单引号的变量计算:${name}
双引号的变量计算:张三

一个$符号紧跟着一对花括号,花括号里放表达式,如${name}、${1+1}等,只有一个变量的时候,可以省略花括号,如$name。

集合

List

task printList {
def numList = [1,2,3,4,5]
println numList.getClass().name println numList[1]//访问第二个元素
println numList[-1]//访问最后一个元素
println numList[-2]//访问倒数第二个元素
println numList[1..3]//访问第二个到第四个元素 numList.each {
println it
}
}

Groovy还为List提供了非常方便的迭代操作,这就是each方法。

Map

Map用法和List想像,只不过它的值是一个K:V键值对。访问也非常灵活,采用map[key]或者map.key都可以。

task printMap{
def map1 = ['name':'张三','age':18]
println map1.getClass().name println map1['name']
println map1.age map1.each{
println "key:${it.key},Value:${it.value}"
}
}

方法

括号可以省略

task invokeMethod{
method1(1,2)
method1 1,2
} def method1(int a,int b){
println a+b
}

return可以不写

在Groovy中,定义有返回值的方法时,return语句不是必需的。当没有return时,Groovy会把方法执行过程中的最后一句代码作为返回值。

task printMethodReturn{
def max1 = method2 1,2
def max2 = method2 3,5
println "max1:${max1},max2:${max2}" } def method2(int a,int b){
if(a>b){
a
}else{
b
}
}

代码块可以作为参数传递

JavaBean

task helloJavaBean{
Person p = new Person()
println "名字是:${p.name}"
p.name="张三"
println "名字是:${p.name}"
println "年龄是:${p.age}"
} class Person{
private String name public int getAge(){
18
}
}

在Groovy中,并不是一定要定义成员变量才能作为类的属性访问。我们直接用getter/setter方法,也一样可以当作属性访问。

闭包

闭包是Groovy的一个非常重要的特性,是DSL的基础。

初识闭包

task helloClosure{
customEach{
println it
} eachMap{k,v->println "${k} is ${v}"}
} def customEach(closure){
for(int i in 1..10){
closure(i)
}
}

向闭包传递参数

当闭包有一个参数时,默认就是it,当有多个参数时,it就不能表达了,我们需要把参数一一列出。

def eachMap(closure){
def map1 = ["name":"张三","age":18]
map1.each{
closure(it.key,it.value)
}
}

闭包委托

Groovy的闭包有thisObject,owener,delegate三个属性。默认情况下,delegate和owner是相等的,但是delegate是可以被修改的。

thisObject的优先级最高,thisObject其实就是这个构建脚本的上下文,它和脚本中的this对象是相等的。优先级从高到低依次是:thisObject>owner>delegate。

在DSL中,比如Gradle,我们一般会指定delegate为当前的it,这样我们在闭包内就可以对该it进行配置,如下:

task configClosure{
person{
name="张三"
age = 18
dumpPerson()
}
} class Person{
String name
int age def dumpPerson(){
println "name:${name},age:${age}"
}
} def person(Closure<Person> closure){
Person p = new Person()
closure.delegate = p
closure.setResolveStrategy(Closure.DELEGATE_FIRST)
closure(p)
}

DSL

DSL,即Domain Specific Language,领域特定语言,就是专门关注某一领域的语言,在于专,而不是全。

Gradle就是一门DSL,它是基于Groovy,专门解决自动化构建的DSL。

【Gradle】Groovy基础的更多相关文章

  1. Gradle Groovy 基础语法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Gradle+Groovy基础篇

    在Java项目中,有两个主要的构建系统:Gradle和Maven.构建系统主要管理潜在的复杂依赖关系并正确编译项目.还可以将已编译的项目以及所有资源和源文件打包到.war或.jar文件中.对于简单的构 ...

  3. Gradle语法基础解析

    在从ADT转移到AndroidStudio下开发,必然会遇到Gradle脚本打包的问题.看懂一个脚本最基本的前提就是了解它的语法,我在转移开发环境的过程中,也开始接触学习Gradle,在此做了一些总结 ...

  4. gradle使用基础

    说明 介绍gradle使用基础,gradle基础脚本结构和常规使用方法,以及一个简单的gradle示例.主要是为了简单的介绍gradle使用. gradle环境配置 gradle可以通过两种方式运行g ...

  5. Groovy系列(3)- Groovy基础语法

    Groovy基础语法 动态类型 Groovy定义变量时:可以用Groovy风格的def声明,不指定类型:也可以兼容Java风格,指定变量类型:甚至还可以省略def或类型 def t1 = 't1' S ...

  6. Groovy基础语法

    Groovy 基础语法 变量定义 1.支持动态类型,使用def关键字定义变量 // Java中定义变量的方式 int age = 18; String name = "张三"; / ...

  7. Gradle系列之Groovy基础篇

    原文发于微信公众号 jzman-blog,欢迎关注交流. 上一篇学习了 Gradle 的入门知识,Gradle 基于 Groovy,今天学习一下 Groovy 的基础知识,Groovy 是基于 JVM ...

  8. 《Gradle权威指南》--Groovy基础

    No1: Groovy中分号不是必须的 No2: Groovy中,单引号和双引号都可以定义一个字符串常量,不同的是单引号标记的是纯粹的字符串常量,而不是对字符串里的表达式做运算,但是双引号可以. ta ...

  9. 从头开始学gradle【Gradle 构建基础】

    构建基础 Project 和 task:projects 和 tasks是 Gradle 中最重要的两个概念. 任何一个 Gradle 构建都是由一个或多个 projects 组成.每个 projec ...

随机推荐

  1. Vue ES6箭头函数使用总结

    Vue ES6箭头函数使用总结   by:授客 QQ:1033553122   箭头函数 ES6允许使用“箭头”(=>)定义函数: 函数不带参数 定义方法:函数名称 = () => 函数体 ...

  2. HTTP 400 与 SpringMVC的 HttpPutFormContentFilter、FormContentFilter

    前端发送了一个http PUT请求,如下, json_xml: {,},,}},,},,}},},}},,},{,}],,},,}},,,,},,}},},}},,},{,}],,},,}},,},{ ...

  3. Appium+Java 自动化测试系列一:环境搭建

    Appium+Java 自动化测试框架搭建主要分为以下几个方面的下载安装及环境配置 1.Java开发环境 涉及到的内容又jdk.编译器工具(推荐jdk 1.8.Eclipse编译器或者IDEA编译工具 ...

  4. CF140C New Year Snowmen

    题目链接 这道题其实吧,水,我们教练说过,不要看标签,这只是CSP第一题的题目 思路嘛,priority_queue和贪心,就这样,很水 这是代码 还有,一定要在cf上交,不然--可以看一下提交记录, ...

  5. SpringMVC通过Redis实现缓存主页

    这里说的缓存只是为了提供一些动态的界面没办法作静态化的界面来减少数据库的访问压力,如果能够做静态化的话的还是采用nginx来做界面的静态化,这样可以承受高并发的访问能力. 好了,废话少说直接看实现代码 ...

  6. 修改vscode的文件,对应的磁盘文件不改变

    两种解决办法: 首先:修改VSCode默认配置文件,点击左下角设置标志图 -> 设置,出来了设置相关的东西,搜索 files.autoSave 第一种:把"files.autoSave ...

  7. thinkphp6安装报错,composer install tp6 报错 Parse error: syntax error

    composer install thinkphp6 报错 Parse error: syntax error, unexpected ':', expecting '{' in vendor\top ...

  8. android 启动流程 相关2 init进程 属性服务

    Init属性服务 系统属性服务 属性梳理 来源和读取时机 来源:内核参数 ro.kernel.*   代表有qemu内核参数才会设置(在虚拟机中) ro.boot.*     1.内核设备树相关的设备 ...

  9. CSP2019 游记

    \(\text{CSP 2019}\) 游记 \[\text{草}\] \[\text{By:Luckyblock}\] \[Day\ -1:\] \(19:00\) 送行饭, 被摁在墙角干了 因为偏 ...

  10. 【RTOS】为H7配套的uCOS-III模板也是可以用于MDK AC6的,提供个模板

    AC6模板 链接:https://pan.baidu.com/s/1_4z_Lg51jMT87RrRM6Qs3g   提取码:2gns 原始的这个模板直接修改为AC6: 编译有几十处警告,修改下面三个 ...