前言

在前面我们学习了为什么现在要用Gradle?和Gradle入门前奏两篇文章,对Gradle也有了大概的了解,这篇文章我们接着来学习Groovy的基础,要想学好Gradle,Groovy是必须要掌握的。Groovy仅凭一篇文章是介绍不完的,这里会带大家快速的入门Groovy,讲解Groovy和Java不同的部分,想要更多了解Groovy可以查看Groovy官方文档和Groovy API文档。

1.Groovy概述

Groovy是Apache 旗下的一种基于JVM的面向对象编程语言,既可以用于面向对象编程,也可以用作纯粹的脚本语言。在语言的设计上它吸纳了Python、Ruby 和 Smalltalk 语言的优秀特性,比如动态类型转换、闭包和元编程支持。 Groovy与 Java可以很好的互相调用并结合编程 ,比如在写 Groovy 的时候忘记了语法可以直接按Java的语法继续写,也可以在 Java 中调用 Groovy 脚本。比起Java,Groovy语法更加的灵活和简洁,可以用更少的代码来实现Java实现的同样功能。

2.Groovy编写和调试

Groovy的代码可以在Android Studio和IntelliJ IDEA等IDE中进行编写和调试,缺点是需要配置环境,这里推荐在文本中编写代码并结合命令行进行调试(文本推荐使用Sublime Text)。关于命令行请查看Android Gradle(二)Gradle入门前奏这篇文章。 具体的操作步骤就是:在一个目录中新建build.gradle文件,在build.gradle中新建一个task,在task中编写Groovy代码,用命令行进入这个build.gradle文件所在的目录,运行gradle task名称 等命令行对代码进行调试,本文中的例子都是这样编写和调试的。

3.变量

Groovy中用def关键字来定义变量,可以不指定变量的类型,默认访问修饰符是public。

def a = 1;

def int b = 1;

def c = "hello world";

复制代码

4.方法

方法使用返回类型或def关键字定义,方法可以接收任意数量的参数,这些参数可以不申明类型,如果不提供可见性修饰符,则该方法为public。 用def关键字定义方法。

task method <

add (1,2)

minus 1,2 //1

}

def add(int a,int b) {

println a+b //3

}

def minus(a,b) {//2

println a-b

}

复制代码

如果指定了方法返回类型,可以不需要def关键字来定义方法。

task method <

def number=minus 1,2

println number

}

int minus(a,b) {

return a-b

}

复制代码

如果不使用return ,方法的返回值为最后一行代码的执行结果。

int minus(a,b) {

a-b //4

}

复制代码

从上面两段代码中可以发现Groovy中有很多省略的地方:

语句后面的分号可以省略。

方法的括号可以省略,比如注释1和注释3处。

参数类型可以省略,比如注释2处。

return可以省略掉,比如注释4处。

5.类

Groovy类非常类似于Java类。

task method <

def p = new Person()

p.increaseAge 5

println p.age

}

class Person {

String name

Integer age =10

def increaseAge(Integer years) {

this.age += years

}

}

复制代码

运行 gradle method打印结果为: 15

Groovy类与Java类有以下的区别:

默认类的修饰符为public。

没有可见性修饰符的字段会自动生成对应的setter和getter方法。

类不需要与它的源文件有相同的名称,但还是建议采用相同的名称。

6.语句

6.1 断言

Groovy断言和Java断言不同,它一直处于开启状态,是进行单元测试的首选方式。

task method <

assert 1+2 == 6

}

复制代码

输出结果为:

Execution failed for task ':method'.

> assert 1+2 == 6

| |

3 false

复制代码

当断言的条件为false时,程序会抛出异常,不再执行下面的代码,从输出可以很清晰的看到发生错误的地方。

6.2 for循环

Groovy支持Java的for(int i=0;i

//遍历范围

def x = 0

for ( i in 0..3 ) {

x += i

}

assert x == 6

//遍历列表

def x = 0

for ( i in [0, 1, 2, 3] ) {

x += i

}

assert x == 6

//遍历Map中的值

def map = ['a':1, 'b':2, 'c':3]

x = 0

for ( v in map.values() ) {

x += v

}

assert x == 6

复制代码

6.3 switch语句

Groovy中的Switch语句不仅兼容Java代码,还可以处理更多类型的case表达式。

task method <

def x = 16

def result = ""

switch ( x ) {

case "ok":

result = "found ok"

case [1, 2, 4, 'list']:

result = "list"

break

case 10..19:

result = "range"

break

case Integer:

result = "integer"

break

default:

result = "default"

}

assert result == "range"

}

复制代码

case表达式可以是字符串、列表、范围、Integer等等,因为篇幅原因,这里只列出了一小部分。

7. 数据类型

Groovy中的数据类型主要有以下几种:

Java中的基本数据类型

Groovy中的容器类

闭包

7.1 字符串

Groovy中的基本数据类型和Java大同小异,这里主要介绍下字符串类型。在Groovy种有两种字符串类型,普通字符串String(java.lang.String)和插值字符串GString(groovy.lang.GString)。

单引号字符串 在Groovy中单引号字符串和双引号字符串都可以定义一个字符串常量,只不过单引号字符串不支持插值。

'Android进阶解密'

复制代码

双引号字符串 要想插值可以使用双引号字符串,插值指的是替换字符串中的占位符,占位符表达式为${}或者以$为前缀。

def name = 'Android进阶之光'

println "hello ${name}"

println "hello $name"

复制代码

三引号字符串 三引号字符串可以保留文本的换行和缩进格式,不支持插值。

task method <

def name = '''Android进阶之光

Android进阶解密

Android进阶?'''

println name

}

复制代码

打印结果为:

Android进阶之光

Android进阶解密

Android进阶?

复制代码

GString String是不可变的,GString却是可变的,GString和String即使有相同的字面量,它们的hashCodes的值也可能不同,因此应该避免使用使用GString作为Map的key。

assert "one: ${1}".hashCode() != "one: 1".hashCode()

复制代码

当双引号字符串中包含插值表达式时,字符串类型为GString,因此上面的断言为true。

7.2 List

Groovy没有定义自己的集合类,它在Java集合类的基础上进行了增强和简化。Groovy的List对应Java中的List接口,默认的实现类为Java中的ArrayList。

def number = [1, 2, 3]

assert number instanceof List

def linkedList = [1, 2, 3] as LinkedList

assert linkedList instanceof java.util.LinkedList

复制代码

可以使用as操作符来显式指定List的实现类为java.util.LinkedList。 获取元素同样要比Java要简洁些,使用[]来获取List中具有正索引或负索引的元素。

task method <

def number = [1, 2, 3, 4]

assert number [1] == 2

assert number [-1] == 4 //1

number << 5 //2

assert number [4] == 5

assert number [-1] == 5

}

复制代码

注释1处的索引-1是列表末尾的第一个元素。注释2处使用<

7.3 Map

创建Map同样使用[],需要同时指定键和值,默认的实现类为java.util.LinkedHashMap。

def name = [one: '魏无羡', two: '杨影枫', three: '张无忌']

assert name['one'] == '魏无羡'

assert name.two == '杨影枫'

复制代码

Map还有一个键关联的问题:

def key = 'name'

def person = [key: '魏无羡'] //1

assert person.containsKey('key')

person = [(key): '魏无羡'] //2

assert person.containsKey('name')

复制代码

注释1处魏无羡的键值是key这个字符串,而不是key变量的值 name。如果想要以key变量的值为键值,需要像注释2处一样使用(key),用来告诉解析器我们传递的是一个变量,而不是定义一个字符串键值。

7.4 闭包(Closure)

Groovy中的闭包是一个开放的、匿名的、可以接受参数和返回值的代码块。 定义闭包 闭包的定义遵循以下语法:

{ [closureParameters -> ] statements }

复制代码

闭包分为两个部分,分别是参数列表部分[closureParameters -> ]和语句部分 statements 。 参数列表部分是可选的,如果闭包只有一个参数,参数名是可选的,Groovy会隐式指定it作为参数名,如下所示。

{ println it } //使用隐式参数it的闭包

复制代码

当需要指定参数列表时,需要->将参数列表和闭包体相分离。

{ it -> println it } //it是一个显示参数

{ String a, String b ->

println "${a} is a ${b}"

}

复制代码

闭包是groovy.lang.Cloush类的一个实例,这使得闭包可以赋值给变量或字段,如下所示。

//将闭包赋值给一个变量

def println ={ it -> println it }

assert println instanceof Closure

//将闭包赋值给Closure类型变量

Closure do= { println 'do!' }

复制代码

调用闭包 闭包既可以当做方法来调用,也可以显示调用call方法。

def code = { 123 }

assert code() == 123 //闭包当做方法调用

assert code.call() == 123 //显示调用call方法

def isOddNumber = { int i -> i%2 != 0 }

assert isOddNumber(3) == true //调用带参数的闭包

复制代码

8. I/O 操作

Groovy的 I/O 操作要比Java的更为的简洁。

8.1 文件读取

我们可以在PC上新建一个name.txt,在里面输入一些内容,然后用Groovy来读取该文件的内容:

def filePath = "D:/Android/name.txt"

def file = new File(filePath) ;

file.eachLine {

println it

}

复制代码

可以看出Groovy的文件读取是很简洁的,还可以更简洁些:

def filePath = "D:/Android/name.txt"

def file = new File(filePath) ;

println file.text

复制代码

8.2 文件写入

文件写入同样十分简洁:

def filePath = "D:/Android/name.txt"

def file = new File(filePath);

file.withPrintWriter {

it.println("三井寿")

it.println("仙道彰")

}

复制代码

9. 其他

9.1 asType

asType可以用于数据类型转换:

String a = '23'

int b = a as int

def c = a.asType(Integer)

assert c instanceof java.lang.Integer

复制代码

9.2 判断是否为真

if (name != null && name.length > 0) {}

复制代码

可以替换为

if (name) {}

复制代码

9.3 安全取值

在Java中,要安全获取某个对象的值可能需要大量的if语句来判空:

if (school != null) {

if (school.getStudent() != null) {

if (school.getStudent().getName() != null) {

System.out.println(school.getStudent().getName());

}

}

}

复制代码

Groovy中可以使用?.来安全的取值:

println school?.student?.name

复制代码

9.4 with操作符

对同一个对象的属性进行赋值时,可以这么做:

task method <

Person p = new Person()

p.name = "杨影枫"

p.age = 19

p.sex = "男"

println p.name

}

class Person {

String name

Integer age

String sex

}

复制代码

使用with来进行简化:

Person p = new Person()

p.with {

name = "杨影枫"

age= 19

sex= "男"

}

println p.name

复制代码

10.总结

本文大概的介绍了Groovy的一些语法,包括:变量、方法、数据类型等等,比起Groovy 官方文档来说,介绍的并不多,但不要忘了本系列的目标是学习与Android相关的Gradle,Groovy并不是重点,我们只需要了解本文所介绍的内容就够了,如果碰到哪里不会再去查找Groovy 官方文档和Groovy API文档。

本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

作者:刘望舒

链接:https://juejin.cn/post/6844903688629125127

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

android groovy方法,Android Gradle从入门到精通(三)Groovy快速入门指南相关推荐

  1. python从入门到精通视频,python快速入门精讲

    <跟老齐学Python:从入门到精通>pdf下载在线阅读全文,求百度网盘云资源 <跟老齐学Python:从入门到精通>百度网盘pdf最新全集下载:链接: ?pwd=9ib9 提 ...

  2. 简单入门正则表达式 - 第三章 快速入门

    一.字面值字符 正则表达式的作用就是根据给定的字符样式,来匹配目标字符串.而这种匹配方案中,最简单的就是字面值字符的匹配. 那么,什么叫字面值字符匹配呢?简单的说,就是输入一个样式ABC,就能把目标字 ...

  3. 深入理解 Redis Template及4种序列化方式__spring boot整合redis实现RedisTemplate三分钟快速入门

    概述 使用Spring 提供的 Spring Data Redis 操作redis 必然要使用Spring提供的模板类 RedisTemplate, 今天我们好好的看看这个模板类 . RedisTem ...

  4. C4D致富经典入门到精通(三)

    C4D样条曲线创建 C4D基础界面的介绍与常用快捷键:  C4D致富经典入门到精通(一) C4D父子关系的理解与创建参数几何体与可编辑对象: C4D致富经典入门到精通(二) C4D样条曲线创建 :  ...

  5. SWMM从入门到实践教程 02 快速入门案例的绘制

    文章目录 1 建模准备 2 设置各类设施 2.1 添加雨量计 2.2 添加子汇水区(正方形) 2.3 绘制节点(圆形) 2.4 绘制管渠 2.5 添加排水口(三角形) 3 画面调节 1 建模准备 建模 ...

  6. Kali Linux 从入门到精通(三)-入侵系统定制

    Kali Linux 从入门到精通(三)-入侵系统定制 定制 网络配置 临时IP地址 dhclient eth0 ifconfig eth0 192.168.11/24 route add defau ...

  7. PR软件入门教程 Adobe Premiere Pro 快速入门指南

    原文(包含图片)链接:https://www.prjianji.com/1.html 了解如何开始使用面向电影制作人.电视节目制作人.新闻记者.学生和视频制作人员的非线性编辑软件 Premiere P ...

  8. SWMM从入门到实践教程 03 快速入门案例的设施参数设置与批量设置

    文章目录 1 雨量计 1.1 雨量计基础设置 1.2 雨量计数据来源 2 汇水区 2.1 参数讲解 2.2 设置结果 3 检查井 3.1 参数讲解 3.2 批量设置 4 管道 4.1 参数讲解 4.2 ...

  9. Android原生UI开发框架 《Jetpack Compose入门到精通》最全上手指南

    前言 在去年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明 ...

最新文章

  1. Jackson、FastJson快速入门(整合SpringMVC)
  2. 我的世界 java开发者_我的世界Java版开发者们畅聊水域更新
  3. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数
  4. Flutter入门:Offstage和Visibility
  5. 世上可有后悔药?服务器里建快照
  6. 免费素材大荟萃:免费图标和UI设计
  7. unity3d 取锚点位置_点的投影
  8. 二进制空间权重矩阵_空间计量:空间权重矩阵的构建
  9. 计算机专业英语词汇1690个单词
  10. 【汇编程序】实现1-100求和(使用LOOP循环)
  11. 关闭WPS右键菜单,以及热点,广告弹窗推送
  12. 东方时尚驾校-科目三-雪铁龙-考试技巧
  13. 苹果马桶iPoo,果粉还hold住吗
  14. python万年历节气_python3实现万年历(包括公历、农历、节气、节日)
  15. 年末大盘点 2008十大最受欢迎的装机软件
  16. adb和frida的一点简单使用记录
  17. 测试开发,测试架构师为什么能拿50 60k呢需要掌握哪些技能呢
  18. Python-打印指定范围内的全部回文素数(高教社,《Python编程基础及应用》习题8-7) (10分) 回文素数是指一个数既是素数又是回文数,例如131既是素数又是回文数。
  19. 利用python绘制简易词云图(使用jieba进行中文分词)
  20. 复变函数笔记——解析函数、柯西-黎曼方程

热门文章

  1. 03-linux查询端口
  2. Elasticsearch+Mongo亿级别数据导入及查询实践
  3. 关于C# .net JavaScript跨域
  4. GPL协议、LGPL协议与BSD协议的法律区别
  5. JS 浏览器关闭事件
  6. SQLServer2K远程连接问题解决方案(转载自飞狐小屋)
  7. DataGridView绑定list的注意事项
  8. 都别争了!分布式锁也是锁
  9. 转 Spring源码剖析——核心IOC容器原理
  10. Java词汇表(三)L——O