Groovy 语法快速入门

在这里插入图片描述

文章目录

    • 1. Groovy 的特点
    • 2. 基本语法
      • 2.1. 变量
      • 2.2. 字符串
      • 2.3. 条件语句
    • 3. 集合操作
      • 3.1. 列表(List)
      • 3.2. 映射(Map)
    • 4. 循环语句
      • 4.1. 普通循环
      • 4.2. 闭包遍历
    • 5. 方法定义
    • 6. 闭包(Closure)
      • 6.1. 定义与调用
      • 6.2. 默认参数
      • 6.3. 闭包与集合操作
    • 7. 类与对象
      • 7.1. 类定义
      • 7.2. 简化 Getter 和 Setter
    • 8. 操作符增强
      • 8.1. 范围操作符
      • 8.2. 安全导航操作符(`?.`)
      • 8.3. Elvis 操作符(`?:`)
    • 9. 文件操作
      • 9.1. 读取文件
      • 9.2. 写入文件
    • 10. Groovy 与 Java 的互操作
    • 学习建议

Groovy 是一种动态语言,运行在 JVM(Java 虚拟机)上,既可以独立使用,也可以与 Java 无缝集成。它以简洁、灵活的语法著称,是 Gradle 的默认脚本语言。以下是对 Groovy 语法的详细介绍,帮助初学者快速入门。


1. Groovy 的特点

  • 动态语言:可以省略类型声明,代码简洁。
  • 兼容性强:可以直接调用 Java 类库,Java 代码几乎可以直接运行在 Groovy 中。
  • 丰富的语法糖:如闭包、字符串插值、集合操作等。

2. 基本语法

2.1. 变量

  • 动态类型:使用 def 定义变量。
  • 静态类型:直接声明类型。
def name = "Groovy"       // 动态类型
int age = 25              // 静态类型
println "Name: $name, Age: $age"

2.2. 字符串

  • 单引号字符串:普通字符串。
  • 双引号字符串:支持字符串插值。
  • 多行字符串:使用三引号 '''"""
def single = 'Hello'
def interpolated = "Hello, ${name}"  // 字符串插值
def multiline = '''This is
a multiline
string'''

2.3. 条件语句

与 Java 类似,但可以省略括号和类型。

def x = 10
if (x > 5) {
    println "x is greater than 5"
} else {
    println "x is less than or equal to 5"
}

3. 集合操作

Groovy 提供了强大的集合类支持,如 ListMap,并附带许多实用操作。

3.1. 列表(List)

def list = [1, 2, 3, 4, 5]   // 创建列表
println list[0]              // 访问元素
list << 6                    // 添加元素
println list.size()          // 获取大小
list.each { println it }     // 遍历

3.2. 映射(Map)

def map = [key1: "value1", key2: "value2"]  // 创建映射
println map.key1                           // 访问值
map.key3 = "value3"                        // 添加键值对
println map

4. 循环语句

4.1. 普通循环

for (i in 1..5) {  // 范围操作符 ..
    println "Number: $i"
}

4.2. 闭包遍历

list.each { println "Element: $it" }  // $it 是默认变量

5. 方法定义

  • 普通方法
def greet(String name) {
    return "Hello, $name"
}
println greet("World")
  • 简化方法:可以省略 return
def add(a, b) {
    a + b  // 自动返回结果
}
println add(3, 4)

6. 闭包(Closure)

闭包是 Groovy 的核心特性,类似于 Java 的 Lambda 表达式。

6.1. 定义与调用

def closure = { String name -> "Hello, $name" }
println closure("Groovy")

6.2. 默认参数

如果闭包没有显式声明参数,则使用默认变量 it

def greet = { println "Hello, $it" }
greet("World")

6.3. 闭包与集合操作

def numbers = [1, 2, 3, 4, 5]
numbers.each { println it * 2 }  // 将每个元素乘以 2

7. 类与对象

Groovy 支持面向对象编程,与 Java 类似,但更简洁。

7.1. 类定义

class Person {
    String name
    int age
    void introduce() {
        println "My name is $name, and I'm $age years old."
    }
}
def person = new Person(name: "Alice", age: 25)
person.introduce()

7.2. 简化 Getter 和 Setter

Groovy 自动生成 gettersetter 方法。

person.name = "Bob"
println person.name

8. 操作符增强

8.1. 范围操作符

def range = 1..10  // 范围 [1, 10]
println range.contains(5)  // 是否包含

8.2. 安全导航操作符(?.

防止空指针异常。

def person = null
println person?.name  // 不会报错

8.3. Elvis 操作符(?:

用于简化空值处理。

def name = null
println name ?: "Default Name"  // 如果 name 为空,返回默认值

9. 文件操作

Groovy 提供了简便的文件读写方法。

9.1. 读取文件

new File('example.txt').eachLine { line ->
    println line
}

9.2. 写入文件

new File('example.txt').withWriter { writer ->
    writer.write("Hello, Groovy!")
}

10. Groovy 与 Java 的互操作

  • 调用 Java 类
import java.util.Date
def now = new Date()
println now.toString()
  • 将 Groovy 用作 Java
// Java 中调用 Groovy 代码
GroovyShell shell = new GroovyShell();
Object result = shell.evaluate("3 + 4");
System.out.println(result);  // 输出 7

学习建议

  1. 动手实践:尝试使用 Groovy 脚本实现简单的任务,如文件操作、数据处理等。
  2. 阅读官方文档:Groovy 官方文档
  3. 学习 Gradle 构建文件:了解 Groovy 在构建脚本中的实际应用。

通过 Groovy 的灵活语法和丰富特性,你可以大幅提升开发效率!


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 事务管理

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 MySQL 事务管理 收录于专栏[MySQL] 本专栏旨在分享学习MySQL的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 CURD 不加控制&#xff0…

【大模型微调学习5】-大模型微调技术LoRA

【大模型微调学习5】-大模型微调技术LoRA LoRa微调1.现有 PEFT 方法的局限与挑战2.LoRA: 小模型有大智慧 (2021)3.AdaLoRA: 自适应权重矩阵的高效微调 (2023)4.QLoRA: 高效微调量化大模型 (2023) LoRa微调 1.现有 PEFT 方法的局限与挑战 Adapter方法&#xff0c;通过增加模型深…

Windows server服务器之网络安全管理(防火墙入站规则创建)

任务14.1 Windows server 防火墙的管理 系统防火墙概述&#xff1a;无论哪一种操作系统都有自己的防火墙&#xff0c;无论是客户端OS还是服务器端的NOS都有防火墙。 winr-control----打开控制面板 上图是Windows客户端的防火墙&#xff0c;三个重点要关注的内容&#xff1b;网…

【Python】PyWebIO 初体验:用 Python 写网页

目录 前言1 使用方法1.1 安装 Pywebio1.2 输出内容1.3 输入内容 2 示例程序2.1 BMI 计算器2.2 Markdown 编辑器2.3 聊天室2.4 五子棋 前言 前两天正在逛 Github&#xff0c;偶然看到一个很有意思的项目&#xff1a;PyWebIo。 这是一个 Python 第三方库&#xff0c;可以只用 P…

四、CSS3

一、CSS3简介 1、CSS3概述 CSS3 是 CSS2 的升级版本&#xff0c;他在CSS2的基础上&#xff0c;新增了很多强大的新功能&#xff0c;从而解决一些实际面临的问题。 CSS在未来会按照模块化的方式去发展&#xff1a;https://www.w3.org/Style/CSS/current-work.html …

Loki 微服务模式组件介绍

目录 一、简介 二、架构图 三、组件介绍 Distributor&#xff08;分发器&#xff09; Ingester&#xff08;存储器&#xff09; Querier&#xff08;查询器&#xff09; Query Frontend&#xff08;查询前端&#xff09; Index Gateway&#xff08;索引网关&#xff09…

上海亚商投顾:创业板指缩量下跌 多只高位股午后跌停

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整&#xff0c;创业板指领跌&#xff0c;高位股开始出现退潮&#xff0c;建设工业、星光股份、…

libnanomsg详解

libnanomsg&#xff0c;或简称为nanomsg&#xff0c;是一个高性能的消息传递库&#xff0c;它为开发者提供了简单且高效的“可扩展协议”实现。以下是对libnanomsg的详细解析&#xff1a; 一、基本概述 项目地址&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 …

MySQL基础大全(看这一篇足够!!!)

文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引…

geoserver 瓦片地图,tomcat和nginx实现负载均衡

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;GeoServer作为一个强大的开源服务器&#xff0c;能够发布各种地图服务&#xff0c;包括瓦片地图服务。为了提高服务的可用性和扩展性&#xff0c;结合Tomcat和Nginx实现负载均衡成为了一个有效的解决方案。本文将详细…

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

网络编程中的黏包和半包问题

引言 - 什么是黏包和半包&#xff1f; 在网络编程中&#xff0c;黏包和半包问题是常见的数据传输问题&#xff0c;尤其是在使用TCP协议时。Netty作为一个高性能的网络框架&#xff0c;提供了多种解决方案来处理这些问题。下面我将详细解释黏包和半包问题&#xff0c;以及Netty…

F5中获取客户端ip地址(client ip)

当F5设备对其原始设置上的所有IP地址使用NAT时&#xff0c;连接到poo成员&#xff08;nodes、backend servers&#xff09;的出站连接将是NAT IP地址。 pool 成员&#xff08;nodes、backend servers&#xff09;将无法看到真实的客户端 ip地址&#xff0c;因为看到的是F5上的…

【容器】k8s学习笔记原理详解(十万字超详细)

Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个&#xff1a; 可以以它为依据&am…

【他山之石】Leading-Trim: The Future of Digital Typesetting:数字排版的未来 —— Leading-Trim

文章目录 【他山之石】Leading-Trim: The Future of Digital Typesetting&#xff1a;数字排版的未来 —— Leading-TrimHow an emerging CSS standard can fix old problems and raise the bar for web apps1. The problem with text boxes today2. How we got here: a histor…

vue3修改elementui-plus的默认样式的几种方法

#创作灵感 今天写vue的前端项目&#xff0c;因为需要去修改elementui-plus中drawer的默认样式&#xff0c;所以刚好将修改步骤记录下来。 一共提供了三种方法&#xff0c;但亲测第二种最好用。 使用第二种是可以无视自己的代码中是否定义了该盒子&#xff0c;因为有时候盒子的…

Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二…

MaskGCT——开源文本转语音模型,可模仿任何人说话声音

前期介绍过很多语音合成的模型&#xff0c;比如ChatTTS&#xff0c;微软语音合成大模型&#xff0c;字节跳动自家发布的语音合成模型Seed-TTS。其模型随着技术的不断发展&#xff0c;模型说话的声音也越来越像人类&#xff0c;虽然 seed-tts 可以进行语音合成等功能&#xff0c…

socket编程UDP-实现滑动窗口机制与累积确认GBN

在下面博客中&#xff0c;我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程&#xff0c;并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接&#xff08;进阶篇&#xff09;_udp socket发送-CSDN博客 下面博客实现了停等机制。 socket编程UDP-实现停…