Groovy基础

news2025/1/11 14:13:12

Groovy基础

  • 学Groovy有什么用???
  • 一、Groovy简介
  • 二、Mac安装Groovy
    • 1、使用homebrew安装或官网下载
    • 2、配置环境变量
    • 3、重新加载环境变量
  • 二、Groov基本语法
  • 三、更多特性和扩展
  • 四、Groovy简单使用
    • 1、Groovy中的字符串及三大语句结构
    • 2、Groovy类与Java类的之间的主要区别
    • 3、集合操作
    • 4、类导入(Importing Classes)
      • 单个类导入
      • 导入整个包
      • 静态导入
    • 5、异常处理(Exception Handling)
    • 6、闭包
      • 基本闭包定义
      • 闭包作为参数
      • 闭包的简化语法
        • 简化参数定义
        • 简化方法调用
      • 闭包的其他用途


学Groovy有什么用???

Groovy是一种基于Java平台的动态脚本语言,它结合了Java的强大功能和动态语言的灵活性。

  1. 脚本编程:Groovy是一种非常适合编写脚本的语言。它具有简洁的语法和强大的表达能力,可以用于自动化任务、批处理脚本、快速原型开发等。

  2. Java增强:Groovy可以无缝与Java代码进行集成。它与Java语法兼容,并提供了许多便利的语法糖和功能增强,使得编写Java应用程序变得更加简洁和高效。

  3. 领域特定语言(DSL):Groovy提供了创建和使用领域特定语言的能力。DSL是一种专门用于解决特定领域问题的语言,使用DSL可以提高代码的可读性和表达能力。Groovy的灵活语法使得创建DSL变得相对容易。

  4. 脚本测试:Groovy提供了强大的测试支持。它具有丰富的测试框架和工具,可以帮助开发人员编写单元测试、集成测试和功能测试等。

  5. Grails框架:Groovy是Grails框架的官方语言。Grails是一个基于Groovy的全栈Web应用程序开发框架,它简化了开发过程,提供了许多开箱即用的功能和插件,能够快速构建高性能的Web应用程序。

总的来说,学习Groovy可以扩展你的编程能力,并提供一种更简洁、灵活和高效的方式来编写Java应用程序、脚本和领域特定语言。它广泛应用于各种场景,包括脚本编程、测试、Web开发等。

一、Groovy简介

在某种程度上,Groovy 可以被视为 Java 的一种脚本化改良版,Groovy 也是运行在JVM 上,它可以很好地与 Java 代码及其相关库进行交互操作。它是一种成熟的面向对象编程语言,既可以面向对象编程,又可以用作纯粹的脚本语言。大多数有效的 Java 代码也可以转快为有效的 Groovy 代码,Groovy和 Java 语言的主要区别是:完成同样的任务所需的Groovy 代码比 Java 代码更少

其特点为:

  • 功能强大,例如提供了动态类型转换、闭包和元编程支持
  • 支持函数式编程,不需要main函数
  • 默认导入常用的包
  • 类不支持default作用域,且默认作用域为public
  • Groovy中基本类型也是对象,可以直接调用对象的方法
  • 支持DSL(Domain Specific Languages领域特定语言)和其它简洁的语法,让代码变得易于阅读和维护

二、Mac安装Groovy

1、使用homebrew安装或官网下载

Groovy官网
在这里插入图片描述

brew install groovy

2、配置环境变量

 nano ~/.bash_profile 
#Groovy
export GROOVY_HOME=/usr/local/opt/groovy/libexec
export PATH=$GROOVY_HOME/bin:$PATH

control+x保存后按Y确定退出编辑

3、重新加载环境变量

source ~/.bash_profile

在这里插入图片描述

二、Groov基本语法

  1. 变量声明和数据类型
    在Groovy中,可以使用关键字def来声明变量,无需指定数据类型。例如:
def name = "Groovy"
def age = 30

Groovy还支持常见的数据类型,如字符串、整数、浮点数、布尔值等。

  1. 字符串操作
    Groovy提供了丰富的字符串操作功能。你可以使用单引号或双引号来定义字符串,并使用加号进行字符串拼接。例如:
def name = "John"
def greeting = "Hello, " + name + "!"

此外,Groovy还支持字符串模板,可以在字符串中直接引用变量。例如:

def name = "John"
def greeting = "Hello, $name!"
  1. 列表和映射
    Groovy提供了方便的列表和映射数据结构。列表使用中括号表示,元素之间用逗号分隔。例如:
def numbers = [1, 2, 3, 4, 5]

映射使用大括号表示,键值对之间用冒号分隔。例如:

def person = [name: "John", age: 30, city: "New York"]
  1. 条件语句
    Groovy支持常见的条件语句,如if-else语句和switch语句。例如:
def age = 18
if (age >= 18) {
    println("成年人")
} else {
    println("未成年人")
}
def language = "Java"
switch (language) {
    case "Java":
        println("我喜欢Java")
        break
    case "Groovy":
        println("我喜欢Groovy")
        break
    default:
        println("其他语言")
}
  1. 循环语句
    Groovy提供了多种循环语句,如for循环和while循环。例如:
def numbers = [1, 2, 3, 4, 5]
for (number in numbers) {
    println(number)
}
def count = 0
while (count < 5) {
    println(count)
    count++
}
  1. 方法定义
    在Groovy中,可以使用关键字def定义方法。例如:
def sayHello(name) {
    println("Hello, $name!")
}

方法可以有参数和返回值。

三、更多特性和扩展

  1. 闭包
    Groovy中的闭包是一种匿名函数,可以作为参数传递给其他方法或赋值给变量。闭包在Groovy中广泛应用于集合操作、事件处理等场景。例如:
def closure = { name ->
    println("Hello, $name!")
}

closure("John")

闭包还支持多行定义和参数默认值等特性,使其更加灵活和强大。

  1. 文件操作
    Groovy提供了方便的文件操作功能,使得读写文件变得简单。你可以使用File类进行文件的读取和写入,例如:
def file = new File("data.txt")

// 读取文件
def content = file.text
println(content)

// 写入文件
file.write("Hello, Groovy!")

Groovy还支持文件的遍历、复制、删除等操作,让文件处理变得更加高效。

  1. 类和对象
    Groovy可以与Java类和对象无缝集成,同时也提供了一些便捷的语法糖。你可以使用class关键字定义类,使用new关键字创建对象。例如:
class Person {
    String name
    int age

    void sayHello() {
        println("Hello, I'm $name.")
    }
}

def person = new Person(name: "John", age: 30)
person.sayHello()

Groovy还支持扩展方法、属性、注解等特性,使得类的定义更加灵活和易于扩展。

  1. 数据库访问
    Groovy提供了方便的数据库访问功能,可以轻松地执行SQL查询和更新操作。你可以使用内置的Sql类或使用第三方库如GORM进行数据库操作。例如:
@Grab('org.codehaus.groovy.modules:groovy-sql:3.0.7')
import groovy.sql.Sql

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/mydb", "username", "password", "com.mysql.jdbc.Driver")

def result = sql.firstRow("SELECT * FROM users WHERE id = 1")
println(result.name)

sql.execute("UPDATE users SET name = 'Alice' WHERE id = 1")

Groovy的数据库访问功能简化了与数据库的交互,提高了开发效率。

四、Groovy简单使用

  • groovy中使用def定义属性、方法,def支持动态类型声明
  • 单行注释:// 多行注释:/**
  • gradle语句最后的;(分号)是可以省略的
  • groovy可以为属性自动生成getter、setter方法
  • 方法声明时:参数类型、返回值类型、return关键字可以省略,方法调用时,在不引起歧义的地方,可以省略()
  • 变量引用时:在不引起歧义的前提下{}也可以省略,在容易引起歧义的地方不能省略{}
  • 对象属性赋值:
    方式1:对象.属性名=
    方式2:对象[“属性名”]=
    方式3:对象.属性setter方法()
    方式4:具名构造器的方式
  • 读取属性值
    方式1:对象.属性名
    方式2:对象[“属性名”]
    方式3:对象.属性getter方法()

1、Groovy中的字符串及三大语句结构

在这里插入图片描述

2、Groovy类与Java类的之间的主要区别

  • 没有可见性修饰符的类或方法自动是公共的(可以使用一个特殊的注释来实现包的私有可见性)
  • 没有可见性修饰符的字段将自动转换为属性,不需要显式的getter和setter方法
  • 如果属性声明为final,则不会生成setter
  • 一个源文件可能包含一个或多个类(但是如果一个文件不包含类定义的代码,则将其视为脚本)脚本只是具有一些特殊约定的类,它们的名称与源文件相同(所以不要在脚本中包含与脚本源文件相同的类定义)

3、集合操作

Groovy支持List、Map集合操作,并且拓展了Java中的API具体参考如下方法:
List:

  • add():添加某个元素
  • plus():添加某个List集合
  • remove():删除某个指定的元素
  • removeALL():移除某个集合中的元素
  • pop():弹出List集合中的最后一个元素
  • putAt():修改指定下标的元素
  • each():遍历
  • size():获取List列表中元素的个数
  • contatins():判断列表中是否包含指定的值,则返回true

Map:

  • put():向map中添加元素
  • remove():根据某个键做移除,或者移除某个键值对
  • +、-:支持map集合的加减操作
  • each():遍历map集合

在这里插入图片描述
当使用Groovy语言处理Map时,你可以使用多种方式进行增删改查操作。下面是一些示例代码,展示了如何在Groovy中进行Map的增删改查操作:

  1. 增加元素:
def map = [:] // 创建一个空的Map

// 增加键值对
map['key1'] = 'value1'
map.key2 = 'value2'

// 批量增加键值对
map.putAll([key3: 'value3', key4: 'value4'])

println map // 输出整个Map

在这里插入图片描述

  1. 删除元素:
def map = [key1: 'value1', key2: 'value2', key3: 'value3']

// 删除指定键的值
map.remove('key1')

// 批量删除多个键
map.keySet().removeAll(['key2', 'key3'])

println map // 输出修改后的Map

在这里插入图片描述

  1. 修改元素:
def map = [key1: 'value1', key2: 'value2', key3: 'value3']

// 直接修改指定键的值
map['key1'] = 'new value1'

// 使用replace方法替换键值对
map.replace('key2', 'new value2')

println map // 输出修改后的Map

在这里插入图片描述

  1. 查询元素:
def map = [key1: 'value1', key2: 'value2', key3: 'value3']

// 通过键获取值
def value1 = map['key1']
def value2 = map.get('key2')

println "Value 1: $value1"
println "Value 2: $value2"

// 遍历Map的键值对
map.each { key, value ->
    println "Key: $key, Value: $value"
}

// 判断键是否存在
def containsKey = map.containsKey('key1')
def containsValue = map.containsValue('value2')

println "Contains Key: $containsKey"
println "Contains Value: $containsValue"

在这里插入图片描述

这些示例展示了在Groovy中对Map进行增删改查操作的常见方法。你可以根据自己的需求和场景,使用这些方法来处理Map数据。

4、类导入(Importing Classes)

在Groovy中,我们可以通过类导入来引入其他类或库,以便在代码中使用它们。类导入使我们能够更方便地引用类名,而无需每次都使用完全限定的类名。

单个类导入

可以使用import关键字导入单个类。下面是一个示例:

import java.util.Date

def now = new Date()
println now

在上面的示例中,我们导入了java.util.Date类,并创建了一个Date对象。

导入整个包

如果我们想要导入一个包中的所有类,可以使用import关键字后面加上包名.*的方式。例如:

import java.util.*

def list = new ArrayList<String>()
list.add("Groovy")
list.add("Java")
println list

在上面的示例中,我们导入了java.util包,并使用ArrayList类创建了一个列表对象。

静态导入

Groovy还支持静态导入,使我们能够直接使用类的静态成员,而无需使用类名进行限定。示例如下:

import static java.lang.Math.*

def pi = PI
def squareRoot = sqrt(16)

println "PI: $pi"
println "Square root of 16: $squareRoot"

在上面的示例中,我们静态导入了java.lang.Math类的静态成员PIsqrt(),并直接使用了它们。

5、异常处理(Exception Handling)

在Groovy中,我们可以使用try-catch-finally块来捕获和处理异常。异常处理使我们能够在程序执行过程中处理潜在的错误和异常情况。

下面是一个异常处理的示例代码:

def dividend = 10
def divisor = 0

try {
    def result = dividend / divisor
    println "Result: $result"
} catch (ArithmeticException e) {
    println "Error: ${e.message}"
} finally {
    println "Finally block executed"
}

在上面的示例中,我们尝试将dividend除以divisor,但divisor的值为0,会引发ArithmeticException异常。我们使用try-catch块捕获并处理该异常,在catch块中打印错误消息。无论是否发生异常,finally块中的代码都会执行。

除了catch块外,我们还可以使用finally块来执行无论是否发生异常都需要执行的代码,例如清理资源。

Groovy还提供了其他更高级的异常处理技术,如throws声明和自定义异常类,但以上示例覆盖了异常处理的基础用法。

6、闭包

定义:是一个开放的、匿名的代码块,它可以接受参数、也可以有返回值。闭包可以引用其周围作用域中声明的变量
语法:{ [closureParameters -> ] statements}
调用:

  • 第一步:将闭包赋值给一个变量
  • 第二步:变量名()、变量名.call()

Groovy是一门基于Java平台的动态语言,它支持闭包作为一种重要的语言特性。闭包是一种可以被传递和执行的代码块,它可以像变量一样被赋值、传递和调用。

基本闭包定义

在Groovy中,闭包使用花括号 {} 定义,并且可以带有参数和方法体。以下是一个基本的闭包定义示例:

def greeting = { name ->
    "Hello, $name!"
}

println greeting("Alice") // 输出:Hello, Alice!

在上面的示例中,我们定义了一个闭包 greeting,它接受一个参数 name,并返回一个包含问候语的字符串。通过调用闭包,并传递一个参数 "Alice",我们可以得到输出结果 "Hello, Alice!"

闭包作为参数

闭包可以像其他类型的变量一样被传递给方法或函数,并在需要时被调用。以下是一个将闭包作为参数的示例:

def calculate = { operation, a, b ->
    operation(a, b)
}

def add = { x, y -> x + y }
def multiply = { x, y -> x * y }

println calculate(add, 2, 3) // 输出:5
println calculate(multiply, 2, 3) // 输出:6

在这里插入图片描述

在上面的示例中,我们定义了一个 calculate 闭包,它接受三个参数:operation(代表另一个闭包)、ab。通过调用 calculate 并传递一个操作闭包和两个参数,我们可以执行不同的计算操作,这里分别是加法和乘法。

闭包的简化语法

Groovy提供了一些简化语法来定义和使用闭包。

简化参数定义

当闭包只有一个参数时,可以省略参数的括号。以下是一个示例:

def square = { it * it } // 使用默认参数名 "it"

println square(5) // 输出:25

在上面的示例中,我们定义了一个闭包 square,它只有一个参数。由于只有一个参数,我们可以使用默认的参数名 it,并省略参数的括号。通过调用 square 并传递参数 5,我们可以得到输出结果 25

简化方法调用

当闭包作为最后一个参数传递给方法时,可以将闭包放在方法调用的圆括号外部。以下是一个示例:

def numbers = [1, 2, 3, 4, 5]

numbers.each { println it }

在上面的示例中,我们使用 each 方法遍历列表 numberseach 方法接受一个闭包作为参数,用于对列表中的每个元素执行操作。我们将闭包放在方法调用的圆括号外部,使代码更加简洁。

闭包的其他用途

闭包在Groovy中具有广泛的应用,除了上述示例中的基本用法外,还有其他用途,包括:

  • 迭代和集合操作:闭包可以与集合操作方法(如 eachcollectfindAll 等)一起使用,实现对集合元素的迭代和转换。
  • 配置和扩展对象:闭包可以用于配置对象的属性和行为,以及动态地向对象添加新的方法。
  • 回调函数:闭包可以作为回调函数,用于在特定事件发生时执行自定义的操作。

闭包是Groovy的一个强大特性,它提供了灵活和简洁的方式来处理代码块。通过理解和掌握闭包语法,你可以更好地利用Groovy的特性来编写简洁而功能强大的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1带你入门MATLAB图像处理图像类型转换(附matlab程序)

1.简述 学习目标&#xff1a; 图像类型的转换 常用图像格式 图像格式&#xff1a;是存储图像采用的文件格式。不同的操作系统、不同的图像处理软件&#xff0c;所支持的图像格式都有可能不同。 在实际应用中经常会遇到的图像格式有&#xff1a;BMP、GIF、TIFF、PCX、JPEG、P…

FFmpeg5.0源码阅读——avformat_open_input

摘要&#xff1a;本文主要描述了FFmpeg中用于打开文件接口avformat_open_input的具体调用流程&#xff0c;详细描述了该接口被调用时所作的具体工作。   关键字&#xff1a;ffmpeg、avformat_open_input   注意&#xff1a;读者需要了解FFmpeg的基本使用流程&#xff0c;以…

力扣动态规划专题(五)子序列问题 不连续子序列与连续子序列 步骤及C++实现

文章目录 300.最长递增子序列674.最长连续递增子序列动态规划贪心算法 718. 最长重复子数组二维dp数组一维dp数组 1143.最长公共子序列1035.不相交的线53. 最大子序和动态规划贪心算法 300.最长递增子序列 步骤 确定dp数组以及下标的含义 dp[i]&#xff1a;i之前&#xff08;包…

【数据结构】单链表 创建 插入 删除 查找 完整代码

3.1 单链表 3.1.1 定义 注&#xff1a; 元素离散的分布在存储空间中&#xff0c;所以单链表是非随机存取的存储结构。 即不能直接找到表中某个特定的结点&#xff0c;需要从表头开始遍历&#xff0c;依次查找。 定义的代码 typedef struct LNode {ElemType data;//每个节点存放…

第三章 处理机调度与死锁

目录 一、调度的概念、层次 2.1 调度的基本概念 2.2 调度的三个层次 2.2.1 高级调度 2.2.2 低级调度 2.2.3 中级调度 2.2.3.1 进程的挂起态 2.2.4 三层调度的联系、对比 二、进程调度的时机、切换与过程、方式 2.1 进程调度的时机 2.2 进程调度的方式 2.2.1 非抢占…

计网复习题

一、单项选择题 OSI参考模型的物理层负责&#xff08;&#xff09;。 A&#xff0e;格式化报文 B&#xff0e;为数据选择通过网络的路由(网络层) C&#xff0e;定义连接到介质的特性 D&#xff0e;提供远程文件访问能力(应用层) 下列选项中&#xff0c;不属于网络体系结构中所…

常用git操作总结

文章目录 一、git 分支命名规范&#xff08;1&#xff09;master 主分支&#xff08;2&#xff09;develop 开发分支&#xff08;3&#xff09;feature 分支&#xff08;一般简写为feat&#xff09;&#xff08;4&#xff09;hotfix 分支&#xff08;一般简写为fix&#xff09;…

如何用canvas实现一个富文本编辑器

富文本编辑器相信大家都用过&#xff0c;相关的开源项目也很多&#xff0c;虽然具体的实现不一样&#xff0c;但是大部分都是使用DOM实现的&#xff0c;但其实还有一种实现方式&#xff0c;那就是使用HTML5的canvas&#xff0c;本文会带大家使用canvas简单实现一个类似Word的富…

分布式系统学习第四天 fastcgi学习

目录 1. Nginx作为web服务器处理请求 2. http协议复习 3. fastCGI 3.1 CGI 3.3 fastCGI和spawn-fcgi安装 3.4 nginx && fastcgi 3.5我的总结 其他知识点 1. Nginx作为web服务器处理请求 nginx不能处理动态请求 因此把请求发送给fastCGI对动态请求进行处理 静态…

区块链基础之密码学及安全技术

1.2 密码学及安全技术 1.2.1 密码学知识 1.2.1.1 Hash函数 Hash(哈希) 哈希函数是一类数学函数&#xff0c;可以在有限合理的时间内&#xff0c;将任意长度的消息压缩为 固定长度的输出值&#xff0c;并且是不可逆的。其输出值称为哈希值&#xff0c;也称为散列值。 哈希算法…

越权漏洞学习-做你做不了的事情

&#xff08;一&#xff09;、什么是越权漏洞 1、了解越权漏洞&#xff1a; 越权漏洞是指一个用户或者一个攻击者通过利用系统中某一漏洞&#xff0c;可以获得超过其正常权限的权限。也就是说&#xff0c;越权漏洞会使攻击者能够执行未经授权的操作或访问受保护的资源 简单来…

从开发人员的视角面对c盘容量紧缺的一些方案

前言 随着时代的发展&#xff0c;固态价格不断地下降&#xff0c;电脑硬盘容量水平线在不断地上升&#xff0c;近几年新出的主流笔记本自带固态容量也基本上在256G以上。所以通常不会有容量不够而带来的烦恼。个人用户往往是因为视频、游戏等文件占用了大量容量&#xff0c;针…

mmrotate调研

mmrotate调研 MMrotate是什么&#xff1f; ​ 在真实场景中&#xff0c;我们见到的图像不都是方方正正的&#xff0c;比如扫描的图书和遥感图像&#xff0c;需要检测的目标通常是有一定旋转角度的。这时候就需要用到旋转目标检测方法&#xff0c;对目标进行精确的定位&#x…

第三方库介绍——mosquitto

文章目录 概述程序&#xff08;指令&#xff09;说明安装服务端与客户端服务端指令配置配置文件&#xff1a;mosquitto.conf认证配置&#xff1a;pwfile权限配置&#xff1a;aclfile启动服务器&#xff0c;选择配置文件&#xff1a;mosquitto.conf 测试发布指令&#xff1a;订阅…

基于立创EDA的原理图设计进阶(实战开发一个小项目)

目录 学习目标 原理图设计进阶——空气质量检测仪 项目需求 1、功能性需求分析 2、非功能性需求 硬件框架图 元器件选型 MCU sensor LCD WIFI KEY PWOER 原理图设计 元件PCB封装设计-DIP&#xff0c;SOP 理论知识 直插式 贴片式 学习目标 1、熟悉电子产品设…

网络编程详细讲解

网络编程 网络通信 网络 ip 地址 1.概念&#xff1a;用于唯一标识网络中的每台计算机/主机 2.查看ip地址&#xff1a;ipconfig 3.ip地址的表示形式&#xff1a;点分十进制XX.XX.XX.XX 4.每一个十进制数的范围&#xff1a;0~255 5.ip地址的组成网络地址主机地址&#xff0…

团体程序设计天梯赛-练习集L2篇①

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

Python3学习之列表

目录 1.访问列表中的值 2.更新列表 3.删除列表元素 4.Python列表脚本操作符 5.Python列表截取与拼接 6.嵌套列表 7.列表比较 8.Python列表函数&方法 序列是 Python 中最基本的数据结构。序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索…

Go语言doc

1、Go语言doc go doc 命令可以打印附于 Go 语言程序实体上的文档&#xff0c;我们可以通过把程序实体的标识符作为该命令的参数来 达到查看其文档的目的。 所谓Go语言的程序实体&#xff0c;是指变量、常量、函数、结构体以及接口&#xff0c;而程序实体的标识符即是代表它们…

JDBC 和数据库连接

JDBC 和数据库连接 基本介绍 JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。Java程序员使用JDBC&#xff0c;可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。JDBC的基本原理图&#xff3b;重要&#xff…