Android Gradle开发与应用 (二) : Groovy基础语法
1. Groovy是什么
Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,并能够无缝地与Java代码集成和互操作,增加了很多动态类型和灵活的特性。(闭包、DSL)
语法和Java非常相似这个特点,意味着,如果我们完全不懂Groovy的语法,也可以按Java的语法来写Groovy代码。 这对于Java工程师来说是非常友好的。
不过,如果我们懂得一些Groovy的语法,那么对于Groovy的开发,会更加的方便和得心应手。以下是一些Groovy区别于Java的一些特性。

2. def类型推断
在 Groovy 编程语言中,def 关键字是一个非常灵活的声明符,它用于定义变量、方法或属性,并且允许类型推断。使用 def 时,编译器会根据所赋值的对象自动确定变量的类型,因此开发者不需要显式地指定变量的类型。
2.1 变量定义:
当你使用 def 声明一个变量时,Groovy 不需要知道变量的具体类型,它可以在运行时动态地决定变量的类型。
def a = 10 // a 将被推断为整数类型 Integer
def b = "Hello" // b 将被推断为字符串类型 String
2.2 可变类型:
使用 def 定义的变量可以改变其引用的对象类型,这是因为在 Groovy 中,变量本身没有固定的类型,而是指向了一个对象。
def c = true // c 被推断为布尔类型 Boolean
c = "World" // 现在 c 变成了字符串类型
2.3 方法定义:
在 Groovy 中,def 还可以用来定义方法(函数),此时方法返回的类型也是可以由编译器推断得出或者不返回任何值(void)。
def add(a, b) {return a + b
}
2.4 属性定义:
在类中定义属性时,也可以使用 def,这将创建一个具有隐式 getter 和 setter 的属性,其类型同样是动态推断的。
总之,def 关键字是 Groovy 动态特性的体现,它增强了代码的简洁性和灵活性,特别是在快速开发和脚本编写场景中表现尤为突出。不过,在大型项目或需要严格类型检查的情况下,可能需要更多地考虑是否使用明确类型的变量声明来增强代码的可读性和维护性。
3. 字符串
Groovy中的字符串和java中非常相似,还可以使用单引号''
task stringTest {String str1 = "hello"var str2 = "wrold"def str3 = "!"//print(str1 + str2 + str3)println("${str1} ${str2} " + str3)
}
4. 列表
列表可以直接用[]进行定义,遍历起来也非常方便
task listTest {def list = [5, 6, 7, 8, 9]println list[0]//遍历方式一for (int data in list) {println(data)}//遍历方式二for(int i in 0..4){println(list[i])}
}
5. Map
Map也是一样的,使用[key:value]的形式定义,遍历也非常方便
task mapTest() {def map = ["name": 'heiko', "age": 18]println map["name"]map.each {println itprintln it.key + ":" + it.value}
}task method {def a = methodA(3, 5)println(a)
}
6. 方法
groovy语法当中默认将函数非空(有代码的)最后一行作为结果进行返回
def methodA(int a, int b) {//groovy语法当中默认将函数非空(有代码的)最后一行作为结果进行返回a + b
}
7. 类
类的使用和Java中几乎一样
class Student {private String nameprivate int ageprivate String getName() {return name}private int getAge() {return age}private void setName(String name) {this.name = name}private void setAge(int age) {this.age = age}@OverrideString toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}task classTest() {Student student = new Student()student.name = "heiko"student.age = 20println(student)student.setName("XXX")student.setAge(21)println(student)
}
8. 闭包
本质是一个开放的、匿名的代码块,它可以接受参数、也可以有返回值。
可以认为闭包是一个匿名的接口或类。
8.1 语法
闭包的参数可以是0个、1个或多个
{ [params ->] //具体代码
}
Groovy大括号
{}是闭包,小括号()是可以省略的,默认是带有小括号的,但是Groovy因为是糖果语法可以省略小括号
闭包{}只针对{}区域内有效。
8.2 一个最简单的闭包
def myClosure = {println("running start...")println("running end...")
}//调用闭包方式一
myClosure()
//调用闭包方式二
myClosure.call()
9. 示例 : 使用groovy语法读取一个文件 : .properties文件
def getUrlPath(String buildType) {def urlProperties properties = new Properties()def proFile = file("src/main/filters/" + buildType + "/config.properties")if (proFile.canRead()) {properties.load(new FileInputStream(proFile))if (properties != null) {url = properties["SERVER2"]}}url
}
9. Gradle相关的其他文章
Android Gradle开发与应用 (一) : Gradle基础
Android Gradle开发与应用 (二) : Groovy基础语法
Android Gradle插件开发_实现自动复制文件插件
相关文章:
Android Gradle开发与应用 (二) : Groovy基础语法
1. Groovy是什么 Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,并能够无缝地与Java代码集成和互操作,增加了很多动态类型和灵活的特性。(闭包、DSL) 语法和Java非常相似这个特点,意味着,如果我们完全不懂…...
iptables学习
iptables的4表5链的处理流程 一:业务地址请求服务时,首先经过iptables服务,iptables通过校验规则,通过校验是否同意业务访问,规则从上到下,匹配规则都失败了的话,走默认规则 (1&…...
kafka 集群搭建
kafka集群搭建 1. kafka介绍 Apache Kafka是一个开源的流处理平台,由Scala和Java编写1。它是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统2。Kafka的最大特…...
springboot-基础-eclipse配置+helloword示例
备份笔记。所有代码都是2019年测试通过的,如有问题请自行搜索解决! 下一篇:springboot-基础-添加model和controller的简单例子常用注解含义 目录 配置helloword示例新建项目创建文件 配置 spring boot官方有定制版eclipse,也就是…...
关于HTML标签应用教程
简介 HTML(HyperText Markup Language)是用于创建网页结构的标记语言。在本教程中,我们将介绍一些常用的HTML标签,以及它们的用法和示例。 1. HTML基础结构 <!DOCTYPE html> <html> <head><title>页面…...
3. 台阶问题
数楼梯 题目描述 楼梯有 N N N 阶,上楼可以一步上一阶,也可以一步上二阶。 编一个程序,计算共有多少种不同的走法。 输入格式 一个数字,楼梯数。 输出格式 输出走的方式总数。 样例 #1 样例输入 #1 4样例输出 #1 5提示…...
推荐一个 Obsidian 的 ChatGPT 插件
源码地址:https://github.com/nhaouari/obsidian-textgenerator-plugin Text Generator 是目前我使用过的最好的 Obsidian 中的 ChatGPT 功能插件。它旨在智能生成内容,以便轻松记笔记。它不仅可以在 Obsidian 中直接使用 ChatGPT,还提供了优…...
aws的RDS数据库开启慢查询日志
#开启慢日志两个参数 slow_query_log 1 设置为1,来启用慢查询日志 long_query_time 5 (单位秒) sql执行多长时间被定义为慢日志1. 点击RDS然后点击参数组,选择slow_query_log,设置为1【表示开启慢日志】点击保存…...
一文读懂 Python 值传递和引用传递
文章目录 版本前言形参和实参值传递和引用传递Python 变量存储值语义和引用语义值语义引用语义 探讨 Python 值传递和引用传递不可变(immutable)类型可变(mutable)类型案例一案例二 拓展:不可变类型真的不可变…...
Linux进阶——系统安全,重要文件,加固系统的相关配置
目录 引出Linux系统安全一、重要文件二、帐户口令三、权限管理四、日志配置五、服务安全六、其他配置 缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Linux进阶——系统安全,重要文件,加固系统的相关配置 Linux系统安…...
C++三级专项 字符串逆序
输入一串‘!’结束的字符,按逆序输出。 输入 如题述。 输出 如题述。 输入样例 abc! 输出样例 cba解析:strlen(s)用来计算指定的字符串s的长度,不包括结束字符“\0”。 不准直接抄!!! …...
【iOS ARKit】ARWorldMap
ARWorldMap 用于存储 ARSession 检测扫描到的空间信息数据,包括地标(Landmark)、特征点(Feature Point)、平面(Plane)等,以及使用者的操作信息,如使用者添加的 ARAnchor …...
敏捷开发最佳实践:质量维度实践案例之软硬一体持续交付
在过去的Top敏捷实践案例中,我们可以看到企业或团队在敏捷质量管理上的创新,包括场景化测试、迭代T1自动化覆盖、一套自动用例到处运行、用例持续运行可视化等,而这也进一步促进了价值流动。本文将继续给大家带来全新的质量维度实践案例&…...
PMP证书的含金量如何?
PMP含金量更多的是“敲门砖”作用,公司招聘的门槛,现在坐项目的大部分都需要PMP/NPDP证书。 当然现在PMP管理模式也很热门,对企业发展很有利,各大企业都有引进改良应用在公司的项目上,之前在校友群里面大家在讨论PMP …...
Linux 下安装Jupyter
pip3 install jupyter pip3 install ipython -------------------------------------------- pip3 install jupyterlab jupyter lab pip3 list | grep jupyterlab 启动: python3 -m jupyter lab 2.安装朱皮特 pip3 install -i https://pypi.douban.com/simpl…...
docker 基础(二)
常见命令 Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:https://docs.docker.com/ 数据卷 命令说明文档地址docker volume create创建数据卷docker volume createdocker volume ls创建数据卷docker volume lsdocker volume rm查看所有数…...
LeetCode 刷题 [C++] 第236题.二叉树的最近公共祖先
题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以…...
vue3+vite 项目的创建
这里要提醒一下,如果我们要使用 vue3 的组合式api 的写法的话, 那么我们使用的 vue 版本不能低于 vue3.2 版本,不能低于 vue3.2 版本,不能低于 vue3.2 版本 vue2 已停止维护了, 现在全面拥抱vue3 之前用 vue-cli 创建…...
Windows Server 2022 使用ApacheDS用户认证
Windows Server 2022 使用ApacheDS用户认证 参考文档:https://docs.foxpass.com/docs/windows-ldap-auth-with-pgina 安装pGina软件,打开pGina软件 勾选启用LDAP认证,点击Configure 修改LDAP认证信息 点击Gateway,设置只要登…...
【Oracle】Oracle清理日志空间
(一)通过adrci清理日志空间 1.通过find命令查询大数据文件 find / -type f -size 100M 2.登录oracle数据库服务器用户 su - oracle 3.执行故障诊断命令 adrci 4.查询ADR目录 show home 5.切换到对应目录 set homepath diag/rdbms/orcl 6.执行日志清理命令…...
MusicFree插件开发初探:手把手教你写一个简单的音源接口(.js文件)
MusicFree插件开发实战:从零构建自定义音源接口 第一次看到MusicFree的插件列表时,我就被它的开放性震撼了——这个播放器本身只是个"空壳",所有音源功能都靠插件实现。作为开发者,这意味着我们不仅能自由选择音源&…...
图像处理中的mask(掩膜):从基础概念到实战应用
1. 掩膜到底是什么?从生活场景理解技术概念 第一次听到"掩膜"这个词时,我脑海里浮现的是疫情期间大家戴的医用口罩。这种直觉其实很准确——就像口罩能选择性地保护口鼻区域,图像掩膜也是用来选择性"遮挡"图像的特定区域…...
【2026版】最新SRC漏洞挖掘思路手法详细版!零基础入门到精通,新手收藏这篇就够了!
【2026版】最新SRC漏洞挖掘思路手法详细版!零基础入门到精通,新手收藏这篇就够了! 我看见很多小伙伴总说挖SRC漏洞没有思路,今天和大家聊一聊我对挖src的一些经验和心得。 挖SRC一定要细,慢慢的去分析,不能着急往往越着…...
UniApp分包优化实战:除了压缩代码,你的图片资源真的放对地方了吗?
UniApp分包优化实战:资源规划与性能提升的深层策略 当UniApp应用体积膨胀到一定程度时,分包几乎成为每个开发者必须面对的课题。但大多数教程只停留在基础分包配置层面,很少深入探讨资源管理的艺术。实际上,分包不仅仅是代码的物理…...
mysql为何建议放弃MyISAM_从InnoDB ACID特性分析
MySQL 5.5后默认改用InnoDB,因其支持事务、行级锁、外键及崩溃可恢复,满足现代业务对原子性、高并发和数据一致性的核心需求。为什么 MySQL 5.5 后默认改用 InnoDB因为 MyISAM 不支持事务,而现代业务几乎离不开原子性操作——比如下单扣库存写…...
别再只看像素了!工业相机镜头选型避坑指南:从像面规格到法兰距的实战解析
工业相机镜头选型实战指南:从参数匹配到系统兼容的深度解析 在工业视觉项目中,镜头选型往往成为最容易被低估的环节。许多工程师习惯性地将注意力集中在相机像素和价格上,却忽略了镜头参数与整体成像系统的匹配度。我曾参与过一个锂电池极片检…...
C#怎么实现后台作业调度 C#如何用Quartz.NET配置Cron表达式执行定时调度作业【框架】
Quartz.NET CronTrigger未按时触发的根本原因是时区配置错误和调度器启动时机不当;需显式指定时区、确保Start()在添加所有job/trigger后调用、使用ISchedulerFactory获取调度器、job类须有public无参构造函数且非static或嵌套类。Quartz.NET 的 CronTrigger 为什么…...
联邦学习中的分布式后门攻击(DBA):隐蔽性、持久性与防御挑战
1. 联邦学习与后门攻击的基本概念 联邦学习(Federated Learning)是一种新兴的机器学习范式,它允许多个参与方在不共享原始数据的情况下共同训练模型。想象一下,就像一群医生想要共同研究一种疾病,但又不愿意直接分享病…...
大模型微调进阶:多任务微调实战
什么是多任务微调? 多任务微调的数据组织 多任务微调的训练策略 任务选择与任务冲突 从单任务到多任务:一个渐进路径...
密码学-古典密码
密码学-古典密码 密码学-第一章 古典密码 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 密码学-第一章 古典密码前言一、密码学的概述二、密码的发展阶段 典型应用:古典密码的分类 置换密码代换密…...
