groovy 闭包实战教程

Groovy入门到实战:JVM动态语言核心语法与自动化脚本开发指南 动态语言通过运行时类型推断和灵活的语法特性,在保持代码简洁性的同时提升开发效率。其核心原理在于将类型检查延迟到运行时,并支持闭包、元编程等高级特性,从而在脚本编写、快速原型开发等场景中展现出显著优势。在Java虚拟机(JVM)生态中,Groovy作为一门与Java高度兼容的动态语言,不仅继承了Java的健壮性,还通过简洁的集合操作、强大的字符串插值和与构建工具的无缝集成,极大地简化了自动化运维、测试脚本编写等工程实践。本文聚焦于Groovy的核心语法精要,包括动态类型与def关键字、GString字符串插值 阅读详情

groovy 闭包实战教程

闭包本质是一段匿名的代码块,如是:{ -> } ;
闭包是groovy.lang.Closure类型,因此可以作为参数传入方法,甚至闭包。
同时闭包也是一个方法,没有与之关联的类;因此,其可以有参数和返回值(其实还可以返回一个闭包)。
闭包总是返回代码块的最后一条语句,return关键字是可选的。闭包的方法体代码调用时才执行。

简单示例

这个闭包带有一个参数,把参数乘以2并打印出来,符合->后面的为闭包体。
然后把闭包作为参数传递给其他方法,示例代码如下:

    def doubling = {arg1 -> println arg1*2 }
    println(doubling(5))  -- result is 10
  • 1
  • 2

上面代码也可以简化,默认闭包只有一个参数可以省略,用关键字it代替。

    def doubling = { println it*2 }
  • 1

闭包应用1————遍历

利用闭包可以写出更优雅或简洁的代码,闭包通常包含较少的代码,且容易重用。

grovvy常用的接受闭包的方法有each、collect、find等。

    [1,2,3,4].each( {println it*2}) -- print 2,4,6,8
  • 1

each方法在Groovy JDK中的java.lang.Object中,其参数为闭包,实现对集合的每个成员做确切的功能。上面代码对应的java代码如下:

    List<Integer> list = Arrays.asList(1,2,3);
    for (Integer it :list) {
        System.out.println(it);
    }
  • 1
  • 2
  • 3
  • 4

闭包应用2————重构

特别是一些资源使用前需要打开,最后需要关闭(如文件,jdbc等),我们定义一个ExpensiveResource类。

    class ExpensiveResource {
        def open() { println 'opened!' }
        def writeData(data) { println "data written! $data" }
        def close(){ println 'closed!'}
    }
  • 1
  • 2
  • 3
  • 4
  • 5

为了使用这个类,代码如下:

    def e = new ExpensiveResource()
    try {
        e.open()
        println e.data
    } finally {
        e.close()
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

每次使用该资源是,open和close方法都必须被调用,使用闭包重构。

    def safeResource(Closure closure) {
    def resource = new ExpensiveResource()
    try {
        resource.open()
        closure(resource)
    } finally {
        resource.close()
    }
    }
    safeResource { it -> it.writeData('hello world!') }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

safeResource 方法接受闭包,封装资源管理代码,分离调用代码,使意图更清晰。

groovy采用了类似方法处理文件访问。通过闭包自动实现了打开、关闭、异常处理等场景。

实现函数式编程

curry方法只需要一个参数,从左到右绑定至参数列表,只有左边的参数有用。

下面的闭包实现过滤list的元素。

    def filterList = { filter, list -> list.findAll(filter) }
  • 1

然后定义两个实现过滤逻辑的闭包。

    def even = { it % 2 == 0 }
    def odd = { !even(it) }
  • 1
  • 2

最后,我们创建两个新的闭包,通过在原闭包上使用curry函数。实现对偶数、奇数的过滤。

    def evenFilterList = filterList.curry(even)
    def oddFilterList = filterList.curry(odd)
    assert [0,2,4,6,8] == evenFilterList(0..8)
    assert [1,3,5,7] == oddFilterList(0..8)
Groovy闭包实战:流程控制与方法重构精讲 闭包在 Groovy 中被设计为一种轻量级的匿名代码块,它可以捕获上下文环境中的变量,并作为参数传递或赋值给变量使用。它的灵活性来源于其兼具函数语义和对象特征的双重身份。要真正驾驭闭包,必须从其声明方式、隐式参数机制到返回值推断逻辑进行逐层解析。要创建一个接受闭包参数的方法,只需将参数类型声明为Closure或使用无类型方式定义。以下是一个典型的模板方法示例,用于执行带异常捕获的操作:println "【开始执行】操作即将启动..."try { 阅读详情

相关推荐

parallelfunctions让并行处理变得简单

parallel-functions:让并行处理变得简单

Groovy探索 使用集合方法,写出更加Groovy风格的代码

             Groovy探索 使用集合方法,写出更加Groovy风格的代码  使用了Groovy语言,就能时不时的感受到Groovy语言在编码风格上与Java语言的不同。当然,我们首先感受到的可能就是在Groovy语言中无处不在的闭包,其中最最常用的是each方法。比如,下面的代码段是我们在Java语言中常用的遍历风格:for(int i=0;i     

软件的信雅达 1万+

遥感影像分割实战:LoveDA数据集从下载到训练全流程指南(附避坑技巧)

本文以LoveDA数据集为例,提供了一份详尽的遥感影像语义分割实战指南。内容涵盖从数据下载、理解与预处理,到环境配置、模型选择与训练,再到性能调优与部署的全流程,并重点分享了多个关键环节的避坑技巧,旨在帮助开发者和研究者高效上手并解决实际问题。

cherry的博客 930

Groovy 的多重赋值和方法的多返回值

追溯到刚开始学习 Groovy 还是在  2008 年,距今 2018 年有九年半余,曾记下几篇 Groovy 的日志。那时学习 Groovy 并无明确的目的,只因它是脚本语言, 可用来快速验证 Java API。曾经 BeanShell 芸花一现,JRuby 和 Jython 总是别人家的语言照搬而来的。而 Scala,Nashorn(jjs), JShell 更是后来的事,唯有 Groovy ...

一叶不知秋 5544

利用 IP 中的集成调试功能来调试 PCI Express 链接训练问题

JTAG Debugger”和“In-system IBERT”功能结合在一起即可提供即时信息,用于判断链接训练问题的可能原因。“test_rd.tcl”文件可读取 BRAM 中存储的调试数据,并输出 *.dat 文件,如下所示。同样,您可能看到某一箭头旁的数字较大,表明可能存在不稳定的链接。要采集 PCIe 链接眼图,请在 IP 配置 GUI 的“Add. Debug Options”选项卡中选择“启用 In-System IBERT (Enable In-System IBERT)”选项。

qq_43416206的博客 536

6、线性时序逻辑到确定性自动机的翻译

本博文详细介绍了将线性时序逻辑(LTL)转化为确定性自动机的理论基础、技术方法和实际应用。内容涵盖LTL的基本运算符、确定性自动机的特点及其在模型检测中的作用,以及具体的翻译步骤与优化策略。通过实际案例展示了如何利用这一技术进行系统属性验证,并探讨了翻译过程中可能遇到的挑战及解决方案。

gpu4optimizer的博客 151

Go语言中多个返回值函数写法

Go语言中和C C++有很大不同在于函数可以具有多个返回值。 我们来看看写法 一个返回值写法 package main import "fmt" func return_sigle(r1 int,r2 int ) int{ fmt.Println("r1 = ", r1,"r2 = ",r2) return 10 } func main(){ test := return_sigle(10,100) fmt.Println("test = " , test) } 多个返

flf1234567898的博客 420

安卓手机部署酒馆 SillyTavern 全攻略(Termux 本地安装教程)

本文详细介绍了如何在安卓手机上通过 Termux 环境本地部署 SillyTavern,一个功能丰富的角色扮演对话 AI。步骤包括安装 Termux、Git,克隆 SillyTavern 仓库,安装 Node.js 和依赖,启动 SillyTavern,以及可选的高阶玩法——安装 TAI-Extras 扩展模块。文章还提供了常见问题的解决方案和优化技巧,如更新 SillyTavern、处理报错、文件访问、添加快捷命令和禁用安卓后台进程杀死。通过本教程,用户可以在安卓手机上体验本地部署的 AI 对话,享受更高

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

groovy笔记

groovy笔记

hailin123123的博客 901

DMC-E 系列总线控制卡----雷赛板卡介绍(十七)

低的速度平稳地接近目标位置,降低运动部件对接触点的冲击。设置插补目标位置,插补方向,以确定插补动作。圆形区域限位,即运动仅在用户设定的圆形范围内进行,超出这个范围,运动会依据设定。首先,用户需要绑定两个轴进而确定该功能所处的坐标系。仅支持平面圆形限位,不支持空间圆形限位。径,可以确定该区域在坐标系中的位置。)运动开始前,用户应当将旋转轴调整到与插补曲线的起点位置相切的角度;可以配合椭圆插补或圆弧插补运动,实现跟随轴的旋转运动角度与曲线当前。外,其它运动形式若开始运动时在限位区域外,则禁止运动;

A_nanda的博客 653

最新Python爬虫实战(入门爬虫篇)——案例17:某天气网40天天气预报数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过分析某天气网的数据接口,成功实现了对40天天气预报数据的批量采集。抓包分析:利用浏览器开发者工具找到隐藏的JSONP数据接口,掌握URL构成规律。请求模拟:构造带有Referer和User-Agent的请求头,添加时间戳参数避免缓存,获取原始数据。数据解析:处理JSONP格式,去除前缀后使用json模块解析,提取所需字段并规范化日期格式。数据存储:利用pandas将结构化数据保存为Excel文件,便于后续分析和使用。动态数据接口的发现与分析JSONP数据的清洗与解析。

努力让自己发光,对的人才能迎着光而来 22万+

实战 Groovy: 用 curry 过的闭包进行函数式编程

在 Groovy 中处处都是闭包,Groovy 闭包惟一的问题是:当每天都使用它们的时候,看起来就有点平淡了。在本文中,客座作者 Ken Barclay 和 John Savage 介绍了如何对标准的闭包(例如闭包复合和 Visitor 设计模式)进行 curry 处理。curry() 方法是由 Haskell Curry 发明的,在 JSR 标准发布之前就已经在 Groovy 语言中了。...

justJavaC的专栏 343

SAP Group Reporting入门指南(1)--开篇及系统环境搭建

文章介绍了SAP GR的发展历程、与BPC的对比优势,数据收集的多种方式(实时同步、外部导入等)以及合并整体流程,并推出《SAP Group Reporting入门指南》专栏。

bflyfish的博客 284

[转载]实战 Groovy: 用 curry 过的闭包进行函数式编程

实战 Groovy: 用 curry 过的闭包进行函数式编程在 Groovy 中处处都是闭包,Groovy 闭包惟一的问题是:当每天都使用它们的时候,看起来就有点平淡了。在本文中,客座作者 Ken Barclay 和 John ...

congji3817的博客 238

Allegro172版本多人协同在线设计操作指导

首先用户需要在同一个局域网下,并且Allegro172的版本必须一致,比如都是S082的版本。另外一个用户同样打开相同版本的172,选择Symphony Team design。Allegro升级到172版本,可以支持多人协同设计,并且实时同步,具体操作如下。协同模式下,不能直接保存文件,需要另存版本,注意时常保存文件,以免丢失数据。第一个用户打开PCB,选择Symphony Team design。等待一会出现如下窗口,表示已经共享成功了,并且记下IP地址。出现一个窗口,输出开共享用户的IP地址。

weixin_54787054的博客 4954

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程

实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程 转载自:http://www.ibm.com/developerworks/cn/java/j-pg06239.html   随心所欲添加方法 Scott Davis, 创始人, ThirstyHead.com 简介: 进入到 Groovy 风格的元编程世界。在运行时向类动态添加方法的能力 — 甚至 Java™ 类以及 final Java 类 — 强大到令人难以置信。不管是用于生产代码、单元测试或介于两者之间的任

谢炜的专栏 1274

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Groovy实战一

一、闭包与基本类型结合使用(闭包实现循环): /** * 闭包与基本类型结合使用 * 举例:实现阶乘 10! */ //使用循环: 传统方法 int sum1 = 1 for (i = 1; i < 6; i++) { sum1 *= i } println("sum1 = " + sum1) //使用循环: groovy用法 int sum2 = 1 for (i i...

songzi1228的博客 611

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Gradle DSL实战】从Groovy闭包到Kotlin Lambda:揭秘构建脚本的语法糖与底层逻辑

本文深入解析Gradle DSL从Groovy闭包到Kotlin Lambda的语法演变与底层实现原理。通过对比两种语言的DSL特性,揭示构建脚本背后的语法糖机制,并提供从Groovy迁移到Kotlin DSL的实用指南,帮助开发者更好地理解和优化Gradle构建流程。

weixin_30607029的博客 548

groovy_流利的Groovy

在你开始前 了解对本教程的期望以及如何最大程度地利用本教程。 关于本教程 如果有人今天打算完全重写Java语言,那么Groovy与Java 2.0非常相似。 Groovy而不是替换Java,而是对其进行了补充,提供了一种更简单,更流畅的语法,其中类型检查在运行时动态完成。 您可以使用Groovy即时编写Java应用程序,将Java模块粘合在一起,甚至扩展现有的Java应用程序,甚至...

cusi77914的博客 1306

groovy解析HTML 隐藏层,Gradle学习笔记之Groovy

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。Gradle的构建脚本build.gradle和setting.gradle都是可执行的Groovy脚本(不过它们不可以在Groovy运行时环境下运行, 由于上述.gradle文件都需要调用gradle的ap...

weixin_35452206的博客 350

Groovy DSL开发终极指南:从零基础到高级实战

Apache Groovy作为JVM平台上功能强大的多范式编程语言,其**DSL创作能力**让开发者能够构建直观、易读的领域特定语言。无论你是想要简化配置脚本、创建测试框架,还是构建复杂的业务逻辑,Groovy DSL都能为你提供完美的解决方案。😊 ## 为什么选择Groovy DSL? Groovy DSL的核心优势在于其**简洁语法**和**动态特性**。通过[src/main/groo

gitblog_00060的博客 433

从Java工程师的视角看Groovy:不止是糖,更是利刃

摘要:Java工程师必知的Groovy核心价值 Groovy作为JVM上的动态语言,与Java无缝集成又独具优势。它保留了Java语法核心,同时通过闭包、字符串模板、安全导航等语法糖大幅减少代码量。其动态能力(元编程、MOP)支持运行时修改类行为,而@CompileStatic又提供静态类型检查。Groovy在Java生态中占据关键位置:Gradle构建工具、Spock测试框架的核心实现都依赖其特性,同时也是优秀的脚本解决方案。

weixin_49484891的博客 408

Gradle从入门到实战 - Groovy基础

Gradle从入门到实战 - Groovy基础

qq_43661383的博客 152
上一篇: C语言学习之路
下一篇: Java hashCode()方法指南
TuxedoLinux
博客等级 码龄9年 268粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值