Groovy基础入门

news/2024/4/29 2:43:52/文章来源:https://blog.csdn.net/zhangyifang_009/article/details/137093388

一、Groovy简介

Groovy是运行在JVM中的一种动态语言,可以在Java平台上进行编程,使用方式基本与使用Java代码的方式相同,它的语法与Java语言的语法很相似,与Java相比,Groovy更加灵活、简洁,而且完成同样的功能基本上所需要的Groovy代码量会比Java的代码量少,它还增加了很多功能,如:函数式编程、运行时的灵活性以及许多元编程内容。它可以用来构建一个完整的工程,或者作为一个Module,第三方集成到Java代码中。甚至可以作为脚本在执行时动态编译。

官网:https://groovy-lang.org/index.html

二、Groovy的Hello World程序

1. 下载安装groovy环境

到官网下载groovy的sdk,我这里下载的是4.0.20版本,解压到指定的文件夹

配置groovy到系统环境变量中:

GROOVY_HOME:D:\SoftWare\dev\groovy-4.0.20
PATH: %GROOVY_HOME%\bin

设置好环境变量,打开命令行执行命令:groovy -v或者groovy -version命令,看到版本号,则说明环境配置好了
在这里插入图片描述

2.创建HelloWord项目

idea创建demo项目,创建时选择语言为Groovy,SDK为刚才安装的目录
在这里插入图片描述
新建一个类:HelloGroovy.groovy文件,并编写main方法,执行程序,可以看到控制台的输出结果
在这里插入图片描述

三、Groovy基础语法

简单的打印语句

可以直接使用println来打印语句

println "Hello, Groovy!"

def 定义无类型的变量

我们无需显式地声明变量的类型,Groovy 会根据赋给变量的值自动推断其类型

def name = "Even"  
def age = 20  
println "Name: $name, Even: $age"

字符串操作

Groovy的字符串支持模板化,可以使用${}来插入变量值:

def greeting = "Hello"  
def person = "Bob"  
println "${greeting}, ${person}!"

值与引用比较

Groovy中的 == 对应于Java中使用 equals() 方法
Groovy中的 is 对应于Java中使用 == 进行对象引用比较

```java
String name1  =   "Alice"
String name2  =   new  String( "Alice" )
if  (name1   ==  name2) {//  Java中写为 name1.equals(name2)System.out.println( " equal " );
}  else  {System.out.println( " not equal " );
}
if  (name1.is(name2)) {//  Java中写为 name1  == name2System.out.println( " identical " );
}  else  {System.out.println( " not identical " );
}
// 对应输出结果为:
equal 
not identical 

数组和循环

Groovy使用[]来创建列表,并支持使用for-in循环遍历数组元素:

def fruits = ["apple", "banana", "cherry"]  
for (fruit in fruits) {  println fruit  
}

方法定义和调用

def greet(name) {  println "Hello, $name!"  
}  greet("Groovy")

在Groovy的方法中return是可选的

public  String sayHello() {return   " Hello, Groovy "
}
// 或者
public  String sayHello() {" Hello, Groovy "
}

Groovy 中的方法参数可以具有默认值

// 定义一个带有默认参数的方法
def greet(name = "World") {println "Hello, $name!"
}// 调用方法,不提供参数
greet()// 调用方法,提供参数
greet("Alice")

注释

Groovy中的注释比Java多了首行注释#!,其他与Java相同比如单行注释:// 多行注释:/* / 或者是 支持javadoc的/* */

#! 首行 注释
/** 多行注释*/
/*** javadoc 注释*/
//  单行注释

闭包(lambda表达式)

Groovy支持闭包,在 Groovy 中,闭包是一种特殊的对象,它可以被存储在变量中、作为参数传递给方法或者赋值给其他变量。闭包可以捕获其定义时的上下文环境,包括外部变量和方法的引用。我们可以把它看做是一个匿名的函数,可以接收参数,并可以有返回值,通常使用花括号 {} 来定义

// 定义一个简单的闭包
def sayHello = { name ->println "Hello, $name!"
}// 调用闭包
sayHello("Alice")
sayHello("Bob")

默认导包

Groovy默认导入了一些常用的包,我们无需显式导入它们

以下的包均为默认导入的包
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.io.*
java.net.*
java.math.BigDecimal
java.math.BigInteger

四、Java集成Groovy

在Java中使用Groovy有三种方式:通过GroovyShell执行Groovy脚本;通过GroovyClassLoader动态加载Groovy Class文件;通过GroovyScriptEngine脚本引擎加载Groovy脚本。

1. 使用GroovyShell执行Groovy脚本

1)引入依赖

<!-- https://mvnrepository.com/artifact/org.apache.groovy/groovy -->
<dependency><groupId>org.apache.groovy</groupId><artifactId>groovy</artifactId><version>4.0.20</version>
</dependency>

2)定义脚本内容并执行

import groovy.lang.Binding;
import groovy.lang.GroovyShell;public class GroovyShellExample {public static void main(String[] args) {// 创建一个Binding对象,用于绑定变量Binding binding = new Binding();binding.setVariable("name", "Groovy");// 创建GroovyShell实例GroovyShell shell = new GroovyShell(binding);// 执行Groovy脚本Object result = shell.evaluate("println('Hello, ' + name + '!'); return name.length();");// 输出结果System.out.println("Script result: " + result);}
}

在调用含有入参的脚本的时候,参数的传递是通过Binding来完成的。

2.GroovyClassLoader动态加载Groovy Class文件

Groovy类(GroovyClass.groovy):

class GroovyClass {  String greet(String name) {  return "Hello, " + name + "!"  }  
}

调用示例

import groovy.lang.GroovyClassLoader;  
import groovy.lang.GroovyObject;  public class GroovyMethodCallExample {  public static void main(String[] args) throws Exception {  // 创建GroovyClassLoader实例  GroovyClassLoader loader = new GroovyClassLoader();  // 加载Groovy类  Class<?> groovyClass = loader.parseClass(new File("GroovyClass.groovy"));  // 创建Groovy类的实例  GroovyObject groovyObject = (GroovyObject) groovyClass.getDeclaredConstructor().newInstance();  // 调用Groovy方法  String greeting = (String) groovyObject.invokeMethod("greet", "World");  // 输出结果  System.out.println(greeting);  }  
}

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

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

相关文章

C语言例4-6:格式字符d的使用例子

代码如下&#xff1a; //格式字符d的使用例子 #include<stdio.h> int main(void) {int num1123;long num2123456;printf("num1%d,num1%5d,num1%-5d,num1%2d\n",num1,num1,num1,num1);//以四种不同格式&#xff0c;输出int型数据num1的值printf("num2%ld,…

Mybatis别名 动态sql语句 分页查询

给Mybatis的实体类起别名 给Mybatis的xml文件注册mapper映射文件 动态sql语句 1 if 2 choose 3 where 4 foreach 一&#xff09;if 查询指定名称商品信息 语法&#xff1a; SELECT * FROM goods where 11 <if test "gName!null"> and g.g_name like co…

linux:线程同步

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言线程同步条件变量接口简单示例pthread_cond_wait为什么要有mutex伪唤醒问题的解决 (if->while) 总结 前言 本文作为我对于线程同步知识总结 线程同步 同步&…

admin端

一、创建项目 1.1 技术栈 1.2 vite 项目初始化 npm init vitelatest vue3-element-admin --template vue-ts 1.3 src 路径别名配置 Vite 配置 配置 vite.config.ts // https://vitejs.dev/config/import { UserConfig, ConfigEnv, loadEnv, defineConfig } from vite im…

步态采集平台

&#x1f349;步骤一、读取视频每一帧图像 &#x1f349;步骤二、对读取的图像进行分割&#xff0c;得到全景下的步态轮廓图。 ​​​​​​​&#x1f349;步骤三、对读取的图像进行裁剪得到归一化的步态轮廓图。 ​​​​​​​&#x1f349;步骤四、保存这一帧步态轮廓图

【Web应用技术基础】CSS(5)——表格样式

第一题&#xff1a;表格边框 .html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>HTML – 简单表格</title><link rel"stylesheet" href"step1/CSS/style.css"></head><bod…

用 AI 编程-释放ChatGPT的力量

最近读了本书&#xff0c;是 Sean A Williams 写的&#xff0c;感觉上还是相当不错的。一本薄薄的英文书&#xff0c;还真是写的相当好。如果你想看&#xff0c;还找不到&#xff0c;可以考虑私信我吧。 ChatGPT for Coders Unlock the Power of AI with ChatGPT: A Comprehens…

html音频和视频可输入表单input

音频和视频 loop循环播放autoplay自动播放controls显示控制面板<audio src""> //<video src"#">muted静音播放 可输入表单input password密码框 radio单选框 checkbox复选框 file上传文件 text文本框 文本框<input type"text"…

Mysql数据库-DQL查询

Mysql数据库-DQL基本查询 1 DQL基本查询1.1 基础查询1.2 WHERE子句1&#xff09;算术运算符2&#xff09;逻辑运算符3&#xff09;比较运算符A&#xff09;BETWEEN... AND ...B&#xff09;IN(列表)C&#xff09;NULL值判断 4&#xff09;综合练习 2 DQL高级查询2.1 LIKE 模糊查…

Spring用到了哪些设计模式?

目录 Spring 框架中⽤到了哪些设计模式&#xff1f;工厂模式单例模式1.饿汉式&#xff0c;线程安全2.懒汉式&#xff0c;线程不安全3.懒汉式&#xff0c;线程安全4.双重检查锁&#xff08;DCL&#xff0c; 即 double-checked locking&#xff09;5.静态内部类6.枚举单例 代理模…

语音陪玩交友软件系统程序-app小程序H5三端源码交付,支持二开!

电竞行业的发展带动其周边产业的发展&#xff0c;绘制着游戏人物图画的抱枕、鼠标垫、海报销量极大&#xff0c;电竞游戏直播、游戏教程短视频也备受人们喜爱&#xff0c;自然&#xff0c;像游戏陪练、代练行业也随之生长起来&#xff0c;本文就来讲讲&#xff0c;从软件开发角…

CSS(二)---【常见属性、复合属性使用】

零.前言 本篇文章主要阐述CSS常见属性、复合属性&#xff0c;更多前置知识请见作者其它文章&#xff1a; CSS(一)---【CSS简介、导入方式、八种选择器、优先级】-CSDN博客 1.CSS属性 CSS的属性有上百个&#xff0c;但是我们并不需要全部学习&#xff0c;只要我们学习一部分…

3.28学习总结

java 封装 封装体现了java的面向对象的特点,用户不用知道程序是如何运行的,只用按照所给的格式输入参数,便可得到对应的结果. 一个完整的封装需要每个实例变量都用private来修饰并拥有相应的public getter和setter方法. 代码 public class girl {private int age;public st…

自然语言处理(NLP)全面指南

自然语言处理&#xff08;NLP&#xff09;是人工智能领域中最热门的技术之一&#xff0c;它通过构建能够理解和生成人类语言的机器&#xff0c;正在不断推动技术的发展。本文将为您提供NLP的全面介绍&#xff0c;包括其定义、重要性、应用场景、工作原理以及面临的挑战和争议。…

制作一个RISC-V的操作系统七-UART初始化(UART NS16550A 规定 目标 发送数据 代码 extern)

文章目录 UARTNS16550A规定目标发送数据代码extern UART 对应到嵌入式开发中&#xff0c;qemu模拟的就是那块开发板&#xff08;硬件&#xff09; 电脑使用qemu时可以理解为qemu模拟了那块板子&#xff0c;同时那块板子与已经与你的电脑相连接了&#xff08;我们对应的指定的内…

【零基础C语言】编译和链接

1.翻译环境和运行环境 翻译环境&#xff1a;将源代码转化为可执行的机器指令 运行环境&#xff1a;用于执行机器指令 1.1 翻译环境 翻译环境由编译和链接两大过程构建&#xff0c;编译又可以分为三大过程&#xff1a; 【1】预处理(预编译) 【2】编译 【3】汇编 不同的.c文件经…

虚拟机-从头配置Ubuntu18.04(包括anaconda,cuda,cudnn,pycharm,ros,vscode)

最好先安装anaconda后cuda和cudnn&#xff0c;因为配置环境的时候可能conda会覆盖cuda的路径&#xff08;不确定这种说法对不对&#xff0c;这里只是给大家的建议&#xff09; 准备工作&#xff1a; 1.Ubuntu18.04&#xff0c;x86_64&#xff0c;amd64 虚拟机下载和虚拟机Ubu…

【氮化镓】位错对氮化镓(GaN)电子能量损失谱(EEL)的影响

本文献《Influence of dislocations on electron energy-loss spectra in gallium nitride》由C. J. Fall等人撰写&#xff0c;发表于2002年。研究团队通过第一性原理计算&#xff0c;探讨了位错对氮化镓&#xff08;GaN&#xff09;电子能量损失谱&#xff08;EEL&#xff09;…

探索 2024 年 Web 开发最佳前端框架

前端框架通过简化和结构化的网站开发过程改变了 Web 开发人员设计和实现用户界面的方法。随着 Web 应用程序变得越来越复杂&#xff0c;交互和动画功能越来越多&#xff0c;这是开发前端框架的初衷之一。 在网络的早期&#xff0c;网页相当简单。它们主要以静态 HTML 为特色&a…

ArcGIS Pro横向水平图例

终于知道ArcGIS Pro怎么调横向图例了&#xff01; 简单的像0一样 旋转&#xff0c;左转右转随便转 然后调整图例项间距就可以了&#xff0c;参数太多就随便试&#xff0c;总有一款适合你&#xff01; 要调整长度&#xff0c;就调整图例块的大小。完美&#xff01; 好不容易…