当前位置: 首页 > article >正文

【Groovy快速上手 ONLY ONE】Groovy与Java的核心差异

最近在使用的平台上写脚本的语言是Groovy,所以也学习一下,作为 Java 开发者,Groovy 对我们来说会非常友好,而且它的语法更简洁且支持动态类型,所以其实了解下Java和Groovy的差异点就可以快速上手了,以下是 Groovy 与 Java 不同的常用语法核心差异点


1 明显的语法差异

1. 变量声明(动态类型)

  • Groovy 支持动态类型,用 def 声明变量(类型自动推断):
    def name = "Groovy"  // 自动推断为 String
    def num = 42         // 自动推断为 Integer
    
  • 也可以显式声明类型(类似 Java):
    String name = "Groovy"
    

2. 分号可选

  • 分号 ; 在 Groovy 中是可选的(除非一行写多条语句):
    println("Hello, Groovy")  // 不需要分号
    

3. 方法调用括号可选

  • 当方法参数明确时,括号 () 可以省略:
    println "Hello, Groovy"  // 等同于 println("Hello, Groovy")
    

4. 字符串:单引号 vs 双引号

  • 单引号:普通字符串(类似 Java 的 String):
    def s1 = 'Hello'
    
  • 双引号:支持插值(GString):
    def name = "Groovy"
    def s2 = "Hello, $name!"  // 输出 "Hello, Groovy!"
    

5. 集合的简化语法

  • List(默认实现是 ArrayList):
    def list = [1, 2, 3]         // 创建 List
    list << 4                    // 添加元素
    println list[0]              // 访问元素
    
  • Map(默认实现是 LinkedHashMap):
    def map = [name: "Groovy", age: 20]  // 键默认是字符串,无需引号
    println map.name                     // 访问键值(类似属性)
    

2 核心概念差异

1. 闭包(Closure)

  • Groovy 的闭包类似 Java 的 Lambda,但更强大:
    def closure = { a, b -> a + b }
    println closure(1, 2)  // 输出 3
    
  • 隐式参数 it(当闭包只有一个参数时):
    def greet = { "Hello, $it!" }
    println greet("Groovy")  // 输出 "Hello, Groovy!"
    

2. 安全导航操作符(?.)

  • 避免空指针异常:
    def user = null
    println user?.name  // 输出 null,而不是抛异常
    

3. 运算符重载

  • Groovy 允许运算符重载(例如 + 可自定义):
    class Box {int valueBox plus(Box other) { new Box(value: this.value + other.value) }
    }
    def b1 = new Box(value: 1)
    def b2 = new Box(value: 2)
    println (b1 + b2).value  // 输出 3
    

4. Groovy Truth(真值判断)

  • Groovy 中以下情况为 false
    • 空集合/字符串/Map
    • null
    • 数值 0
    • false
  • 示例:
    if ([]) { println "不执行" } else { println "空列表为 false" }
    

3 常用功能增强

1. 集合操作

  • 强大的链式操作:
    def numbers = [1, 2, 3, 4]
    def doubled = numbers.collect { it * 2 }       // [2, 4, 6, 8]
    def even = numbers.findAll { it % 2 == 0 }     // [2, 4]
    

2. Elvis 操作符(?:)

  • 简化三元表达式:
    def name = user.name ?: "Unknown"  // 如果 user.name 为 null,返回 "Unknown"
    

3. Switch 支持更多类型

  • 可以匹配列表、范围、类型等:
    def x = 5
    switch (x) {case 1..10: println "在1到10之间"; breakcase [11, 12]: println "是11或12"; breakcase String: println "是字符串"; break
    }
    

4 常用的集合操作

Groovy提供了丰富的集合操作,以下是一些常用的集合操作及其示例:

1. each 方法

each 方法用于遍历集合中的每个元素,并对每个元素执行指定的操作。

def list = [1, 2, 3, 4, 5]list.each { element ->println element
}

输出:

1
2
3
4
5

2. collect 方法

collect 方法用于对集合中的每个元素进行转换,并返回一个新的集合。

def list = [1, 2, 3, 4, 5]def squaredList = list.collect { element ->element * 2
}println squaredList

输出:

[2, 4, 6, 8, 10]

3. find 方法

find 方法用于查找集合中满足特定条件的第一个元素。

def list = [1, 2, 3, 4, 5]def evenNumber = list.find { element ->element % 2 == 0
}println evenNumber

输出:

2

4. findAll 方法

findAll 方法用于查找集合中所有满足特定条件的元素,并返回一个新的集合。

def list = [1, 2, 3, 4, 5]def evenNumbers = list.findAll { element ->element % 2 == 0
}println evenNumbers

输出:

[2, 4]

5. any 方法

any 方法用于检查集合中是否存在至少一个满足特定条件的元素。

def list = [1, 2, 3, 4, 5]def hasEvenNumber = list.any { element ->element % 2 == 0
}println hasEvenNumber

输出:

true

6. every 方法

every 方法用于检查集合中的所有元素是否都满足特定条件。

def list = [2, 4, 6, 8]def allEvenNumbers = list.every { element ->element % 2 == 0
}println allEvenNumbers

输出:

true

5 Java 开发者易错点

1. ==equals()

  • Groovy 中 == 相当于 equals(),如果要比较引用用 is()
    def s1 = new String("Groovy")
    def s2 = new String("Groovy")
    println s1 == s2   // true(内容相等)
    println s1.is(s2)  // false(引用不同)
    

2. 数组定义

  • Groovy 中定义数组需明确类型或使用 as 关键字:
    def arr1 = [1, 2, 3] as int[]          // 正确
    int[] arr2 = [1, 2, 3]                 // 正确
    

3. 默认导入的包

  • Groovy 自动导入了常用包(如 java.util.*, groovy.util.* 等),注意可能的命名冲突。

6 Groovy的优势

  1. 脚本化执行:Groovy 可以直接运行脚本,无需 public static void main
  2. 利用 Groovy Console:快速测试代码片段。
  3. 逐步引入闭包和 DSL:Groovy 适合编写领域特定语言(DSL)。

相关文章:

【Groovy快速上手 ONLY ONE】Groovy与Java的核心差异

最近在使用的平台上写脚本的语言是Groovy&#xff0c;所以也学习一下&#xff0c;作为 Java 开发者&#xff0c;Groovy 对我们来说会非常友好&#xff0c;而且它的语法更简洁且支持动态类型&#xff0c;所以其实了解下Java和Groovy的差异点就可以快速上手了&#xff0c;以下是 …...

计算机系统---CPU

定义与功能 中央处理器&#xff08;Central Processing Unit&#xff0c;CPU&#xff09;&#xff0c;是电子计算机的主要设备之一&#xff0c;是计算机的核心部件。CPU是计算机的运算核心和控制核心&#xff0c;负责执行计算机程序中的指令&#xff0c;进行算术运算、逻辑运算…...

WEB安全--提权思路

一、情形 在我们成功上传webshell到服务器中并拿到权限时&#xff0c;发现我们的权限很低无法执行特定的命令&#xff0c;这时为了能做更多的操作&#xff0c;我们就需要提升权限。 二、方式 2.1、Windows提权 1、普通用户执行systeminfo命令获取服务器的基本信息&#xff0…...

多layout 布局适配

安卓多布局文件适配方案操作流程 以下为通过多套布局文件适配不同屏幕尺寸/密度的详细步骤&#xff0c;结合主流适配策略及最佳实践总结&#xff1a; 一、‌创建多套布局资源目录‌ ‌按屏幕尺寸划分‌ 在 res 目录下创建以下文件夹&#xff08;根据设备特性自动匹配&#xff…...

selectdb修改表副本

如果想修改doris&#xff08;也就是selectdb数据库&#xff09;表的副本数需要首先确定是否分区表&#xff0c;当前没有数据字典得知哪个表是分区的&#xff0c;只能先show partitions看结果 首先&#xff0c;副本数不应该大于be节点数 其次&#xff0c;修改期间最好不要跑业务…...

Metabase:一个免费开源的BI平台

今天给大家介绍一个开源数据可视化分析工具&#xff1a;Metabase。它可以帮助用户快速连接数据库、执行查询并创建交互式仪表盘&#xff0c;即使非技术人员也能快速上手。 Metabase 支持多种数据源&#xff0c;包括 MySQL、PostgreSQL、Oracle、SQL Server、SQLite、MongoDB、P…...

第15届蓝桥杯省赛python组A,B,C集合

过几天就省赛了&#xff0c;一直以来用的是C&#xff0c;Python蓝桥杯也是刚刚开始准备&#xff08;虽然深度学习用的都是python&#xff0c;但是两者基本没有任何关系&#xff09;&#xff0c;这两天在做去年题时犯了很多低级错误&#xff0c;因此记录一下以便自己复查 PS&am…...

AWS 云运维管理指南

一、总体目标 高可用性:通过跨可用区 (AZ) 和跨区域 (Region) 的架构设计,确保系统运行可靠。性能优化:优化AWS资源使用,提升应用性能。安全合规:利用AWS内置安全服务,满足行业合规要求(如GDPR、ISO 27001、等保2.0)。成本管控:通过成本优化工具,减少浪费,实现FinOp…...

为什么有的深度学习训练,有训练集、验证集、测试集3个划分,有的只是划分训练集和测试集?

在机器学习和深度学习中&#xff0c;数据集的划分方式取决于任务需求、数据量以及模型开发流程的严谨性。 1. 三者划分&#xff1a;训练集、验证集、测试集 目的 训练集&#xff08;Training Set&#xff09;&#xff1a;用于模型参数的直接训练。验证集&#xff08;Validati…...

虚拟现实 UI 设计:打造沉浸式用户体验

VR UI 设计基础与特点 虚拟现实技术近年来发展迅猛&#xff0c;其独特的沉浸式体验吸引了众多领域的关注与应用。在 VR 环境中&#xff0c;UI 设计扮演着至关重要的角色&#xff0c;它是用户与虚拟世界交互的桥梁。与传统 UI 设计相比&#xff0c;VR UI 设计具有显著的特点。传…...

前端Uniapp接入UviewPlus详细教程!!!

相信大家在引入UviewPlusUI时遇到很头疼的问题&#xff0c;那就是明明自己是按照官网教程一步一步的走&#xff0c;为什么到处都是bug呢&#xff1f;今天我一定要把这个让人头疼的问题解决了&#xff01; 1.查看插件市场 重点&#xff1a; 我们打开Dcloud插件市场搜素uviewPl…...

【性能优化点滴】odygrd/quill在编译期做了哪些优化

Quill 是一个高性能的 C 日志库&#xff0c;它在编译器层面进行了大量优化以确保极低的运行时开销。以下是 Quill 在编译器优化方面的关键技术和实现细节&#xff1a; 1. 编译时字符串解析与格式校验 Quill 在编译时完成格式字符串的解析和校验&#xff0c;避免运行时开销&…...

02 反射 泛型(II)

目录 一、反射 1. 反射引入 2. 创建对象 3. 反射核心用法 二、泛型 1. 泛型的重要性 &#xff08;1&#xff09;解决类型安全问题 &#xff08;2&#xff09;避免重复代码 &#xff08;3&#xff09;提高可读性和维护性 2. 泛型用法 &#xff08;1&#xff09;泛型类 …...

Spring Boot 七种事务传播行为只有 REQUIRES_NEW 和 NESTED 支持部分回滚的分析

Spring Boot 七种事务传播行为支持部分回滚的分析 支持部分回滚的传播行为 REQUIRES_NEW&#xff1a;始终开启新事务&#xff0c;独立于外部事务&#xff0c;失败时仅自身回滚。NESTED&#xff1a;在当前事务中创建保存点&#xff08;Savepoint&#xff09;&#xff0c;可局部…...

ZLMediaKit 源码分析——[5] ZLToolKit 中EventPoller之延时任务处理

系列文章目录 第一篇 基于SRS 的 WebRTC 环境搭建 第二篇 基于SRS 实现RTSP接入与WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建 第四篇 WebRTC学习一&#xff1a;获取音频和视频设备 第五篇 WebRTC学习二&#xff1a;WebRTC音视频数据采集 第六篇 WebRTC学习三…...

元宇宙浪潮下,前端开发如何“乘风破浪”?

一、元宇宙对前端开发的新要求 元宇宙的兴起&#xff0c;为前端开发领域带来了全新的挑战与机遇。元宇宙作为一个高度集成、多维互动的虚拟世界&#xff0c;要求前端开发不仅具备传统网页开发的能力&#xff0c;还需要掌握虚拟现实&#xff08;VR&#xff09;、增强现实&#…...

2025年3月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试

2025.03Scratch图形化编程等级考试二级真题试卷 一、选择题 第 1 题 甲、乙、丙、丁、戊五人参加100米跑比赛&#xff0c;甲说:“我的前面至少有两人&#xff0c;但我比丁快。”乙说:“我的前面是戊。”丙说:“我的后面还有两个人。”请从前往后&#xff08;按照速度快慢&a…...

【新能源汽车整车动力学模型深度解析:面向MATLAB/Simulink仿真测试工程师的硬核指南】

1. 前言 作为MATLAB/Simulink仿真测试工程师,掌握新能源汽车整车动力学模型的构建方法和实现技巧至关重要。本文将提供一份6000+字的深度技术解析,涵盖从基础理论到Simulink实现的完整流程。内容经过算法优化设计,包含12个核心方程、6大模块实现和3种验证方法,满足SEO流量…...

MCP协议的Streamable HTTP:革新数据传输的未来

引言 在数字化时代&#xff0c;数据传输的效率和稳定性是推动技术进步的关键。MCP&#xff08;Model Context Protocol&#xff09;作为AI生态系统中的重要一环&#xff0c;通过引入Streamable HTTP传输机制&#xff0c;为数据交互带来了革命性的变化。本文将深入解读MCP协议的…...

dify中配置使用Ktransformer模型

一共是两个框架一个是Ktransformer,一个是dify。 Ktransformer用来部署LLM,比如Deepseek,而LLm的应用框架平台Dify主要用来快速搭建基于LLM应用。 这篇教程主要是用来介绍两个框架的交互与对接的,不是部署Ktransformer也部署部署Dify,要部署Dify、Ktransformer可以直接参考…...

从代码学习深度学习 - GRU PyTorch版

文章目录 前言一、GRU模型介绍1.1 GRU的核心机制1.2 GRU的优势1.3 PyTorch中的实现二、数据加载与预处理2.1 代码实现2.2 解析三、GRU模型定义3.1 代码实现3.2 实例化3.3 解析四、训练与预测4.1 代码实现(utils_for_train.py)4.2 在GRU.ipynb中的使用4.3 输出与可视化4.4 解析…...

二叉树 递归

本篇基于b站灵茶山艾府的课上例题与课后作业。 104. 二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&…...

#SVA语法滴水穿石# (002)关于 |-> + ##[min:max] 的联合理解

今天,我们着重理解一些概念。依靠死记硬背去理解知识点,是不长久的,必须深刻理解知识点的精髓,才能长久记忆。 先看如下的代码: property a2b_p; //描述属性@(posedge clk) $rose(tagError) |-> ##[2:4] $rose(tErrorBit); endproperty a2b_a: asser…...

反常积分和定积分的应用 2

世界尚有同类 前言伽马函数的推论关于数学的思考平面图形的面积笛卡尔心形线伯努利双纽线回顾参数方程求面积星型线摆线 旋转体体积一般轴线旋转被积函数有负数部分曲线的弧长最后一个部分内容-旋转曲面侧表面积直角坐标系极坐标系参数方程 总结 前言 力大出奇迹。好好加油。 …...

新零售系统是什么样的?有什么好处?

一、新零售系统的核心架构与特征 ​技术驱动的分层架构 **​前端展示层&#xff1a;**支持多终端适配&#xff08;如APP、小程序、线下智能设备&#xff09;&#xff0c;采用响应式设计提升用户体验。 **​业务中台层&#xff1a;**基于微服务架构&#xff08;如Spring Clou…...

Element-plus弹出框popover,使用自定义的图标选择组件

自定义的图标选择组件是若依的项目的 1. 若依的图标选择组件 js文件&#xff0c;引入所有的svg图片 let icons [] // 注意这里的路径&#xff0c;一定要是自己svg图片的路径 const modules import.meta.glob(./../../assets/icons/svg/*.svg); for (const path in modules)…...

16进制在蓝牙传输中的应用

在蓝牙传输中&#xff0c;16进制&#xff08;Hexadecimal&#xff09;是一种常用的数据表示方法。它主要用于描述数据包的内容、地址、命令、参数等信息。以下是16进制在蓝牙传输中的具体应用场景和作用&#xff1a; 1. 数据包的表示 蓝牙通信中&#xff0c;所有数据最终都以二…...

思维链 Chain-of-Thought(COT)

思维链 Chain-of-Thought&#xff08;COT&#xff09;&#xff1a;思维链的启蒙 3. 思维链 Chain-of-Thought&#xff08;COT&#xff09;存在问题&#xff1f;2. 思维链 Chain-of-Thought&#xff08;COT&#xff09;是思路是什么&#xff1f;1. 什么是 思维链 Chain-of-Thoug…...

硬件电路(23)-输入隔离高低电平有效切换电路

一、概述 项目中为了防止信号干扰需要加一些隔离电路&#xff0c;而且有时传感器的信号是高有效有时是低有效&#xff0c;所以基于此背景&#xff0c;设计了一款方便实现高低电平有效检测切换电路。 二、应用电路...

多表查询的多与一

1.查寻表需要的条件 1.1.首先我们要了解查询表有哪些 1.1.1.多对一 多对一就是一个年表拥有例外一个表的多条数据 一个表对应立一个表的多条数据&#xff0c;另一个表对应这个表的多条数据 这个点被称为多对一 1.1.2.多对多 多对多简单来说就是需要一个中间商 中间商就…...