groovy闭包语法详解(二)

文章目录

    • 线程中的闭包调用
    • 自定义闭包重写`doCall`
    • 查找并调用闭包成员
    • 闭包中的形参
    • 扩展闭包的实参控制

线程中的闭包调用

package com.juan.groovyclass MyThread extends Thread {// 闭包成员变量Closure closureMyThread(Closure c) {this.closure = c// 启动线程,运行闭包this.start()}// 线程运行方法public void run() {// 这种写法跟js很像,不为null则执行if (closure) {closure()}}
}// 下面两个线程会交替打印
new MyThread({(1..9).each {sleep(10 * it)println it}
})new MyThread({["a", "b", "c", "d"].each {sleep(100)println it}
})

自定义闭包重写doCall

class MyClosure extends Closure{MyClosure(owner) {super(owner)}MyClosure(owner, thisObject) {super(owner, thisObject)}// 该方法在调用闭包时会隐式调用,注意接收的参数类型,如果不加限制,则调用时可传入任何类型Object doCall(String message) {println messageprintln owner // 当前所在类println this // 闭包类return null}
}MyClosure c = new MyClosure(this)
c 'hello'
c 123 // 报错

查找并调用闭包成员

// 定义我的姑娘
class MyGirl {// 公有闭包成员变量public lough = {println 'Hahaha...'}
}void callMyGirlAction(Class clz, String action) {// 通过反射获取闭包成员变量进行调用def myGirl = clz.getDeclaredConstructor().newInstance()myGirl.getClass().getDeclaredField(action).get(myGirl).call()
}callMyGirlAction(MyGirl.class, 'lough')

闭包中的形参

// 以下的闭包中接收各种参数形式(最多一个参数)
def defaultParams = { println it }
def dynamicParams = { arg -> println arg }
def intParams = { int arg -> println arg }
def stringParams = { String arg -> println arg }
def noParams = { -> }// 调用
defaultParams 'hello'
defaultParams() // 可传空
dynamicParams 123
dynamicParams 'hi'
intParams 123
stringParams '123'
noParams()
noParams 1 // 不可传参,报错

默认参数和不接收参数的区别

默认参数it,在调用时不传参则显示null;而空箭头的形式,在调用时不能传参数,否则抛异常

扩展闭包的实参控制

// 用一个数组来接收参数
class Closure1 extends Closure{Closure1(owner) {super(owner)}def doCall(Object[] params ) {println params}
}
closure1 = new Closure1(this)
closure1 'hello' // [hello]
closure1 'hello', 1, 0.1 // [hello, 1, 0.1]// 可接收一个任意类型的参数
class Closure2 extends Closure{Closure2(owner) {super(owner)}def doCall(arg) {println arg}
}
closure2 = new Closure2(this)
closure2 'hello'
closure2 1
closure2 'hello', 1, 0.1 // 报错// 接收一个指定类型的参数
class Closure3 extends Closure{Closure3(owner) {super(owner)}def doCall(String arg) {}
}
closure3 = new Closure3(this)
closure3 'hello'
closure3 1 // 报错// 通过闭包来检查一个数组是否都是数字
def arr = [1, 2, 3, 'a']
Closure intParams = { int arg -> }
arr.each intParams // 报错,检测到字符串a不满足条件

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

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

相关文章

数据结构基础.顺序表与链表

数据结构: 1.衡量一个程序是否优秀: 1.时间复杂度: 数据量增长与程序运行时间的比例关系以函数描述称为时间渐进复杂度函数,简称时间复杂度 O(c) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(n^3) > O…

VMWare中添加Ubuntu20.04.06镜像

一、下载Ubuntu镜像 Ubuntu20.04: 官方下载地址https://releases.ubuntu.com/20.04.6/ 进入官网 点击下图红框位置,下载镜像镜像名为ubuntu-20.04.6-desktop-amd64.iso 也可点击下面链接直接下载:https://releases.ubuntu.com/20.04.6/ubu…

车间多台分散PLC如何在不同协议的情况下实现无线通讯?

项目背景 为推动企业智能化数字化升级,积极响应节能减排与能源可持续发展的号召,进一步增强企业竞争力,同时为避免大幅度电缆铺设及维护工作,厂区需要针对目前的燃煤发电作业进行技术及流程的无线改造。通过这些无线技改措施的实施…

2023年最新自适应主题懒人网址导航v3.9php源码

源码简介 这个懒人网址导航源码是一个基于PHPMySQL开发的网址导航系统。该版本是在原有3.8版本的基础上进行了修复和功能增强。我们建议新用户直接使用这个最新版本,放弃旧版本。如果你有二次开发的能力,可以根据更新日志自行进行升级。我们将在后期继续…

oracle和mysql查询某字段在哪个表中

oracle和mysql查询某字段在哪个表中 oracle的 select TABLE_NAME from user_tab_columns where COLUMN_NAME字段名mysql的: select table_schema ,table_name from information_schema.columns where column_name ‘字段名’ 查询结果table_schema为数据库名&a…

记录一次target引发的事故:一直提示数据库连接超时

你们好,我是金金金。 场景 启动项目,一直报数据库连接超时: The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. The error may exist in com/xuecheng/sy…

稚晖君智元机器人远程机器人系列发布:引领具身智能新高度

在最近的发布会上,前华为“天才少年”稚晖君及其团队亮相了他们的最新作品——智元机器人的第二代远程机器人系列。这次发布会不仅展示了丰富的产品线,还揭示了其未来的发展路线以及开源计划。本文将详细解析本次发布会的亮点和技术背后的创新。 一、发…

unittest 和 pytest 的区别

一、用例编写规则 1.unittest 提供了 test cases、test suites、test fixtures、test runner 相关的类,让测试更加明确、方便、可控。使用 unittest 编写用例,必须遵守以下规则: (1)测试文件必须先 import unittest (2)测试类必须…

js去重的方法

js去重的方法 for循环indexOf const result [] for(let i0;i<arr.length;i){if(result.indexOf(arr[i]-1)){result.push(arr[i])} }filter indexOf arr.filter((item,index,arr) > arr.indexOf(item)-1)用set数据结构&#xff08;set会把数组变成一系列无序的、没有…

实现android清单文件里某个权限动态配置

举例&#xff1a;<uses-permission android:name"android.permission.MANAGE_EXTERNAL_STORAGE" /> 需求&#xff1a;debug有这个权限&#xff0c;release没有这个权限 一. 第一种是第三方库没有引入MANAGE_EXTERNAL_STORAGE权限&#xff0c;实现如下 app的An…

百度最新旗舰大模型文心4.0 Turbo精调服务上线

8月21日&#xff0c;百度智能云宣布&#xff0c;推出文心旗舰大模型ERNIE 4.0 Turbo精调服务&#xff0c;帮助企业利用自身业务数据&#xff0c;训练出更适合企业应用场景的大模型&#xff0c;极大提升模型在业务中的使用效果&#xff0c;即日起企业用户可登录百度智能云官网进…

Kafka事件(消息、数据、日志)的存储

1、查看有关kafka日志配置文件的信息 2、查看kafka全部主题的日志文件 3、查看每个主题的日志文件 4、__consumer_offsets-xx文件夹的作用 package com.power;public class Test {public static void main(String[] args) {int partition Math.abs("myTopic".hashCo…

秋招TCP篇(较全的TCP网络知识,通俗理解底层逻辑)

TCP详细知识 计算机网络八股-局域网和广域网详解八股-OSI七层模型和TCP/IP五层模型八股-数据在网络之间传递的过程八股-UDP详解根据协议格式详解TCPSocket详解八股-TCP可靠性机制确认应答超时重传超时重传等待时间数据去重 八股-三次握手和四次挥手三次握手四次挥手为什么要三次…

大一新生如何学好计算机

目录 计算机有哪些工作种类他们的区别如何克服编程学习中的挫折感的&#xff1f; 计算机有哪些工作种类 软件工程 软件开发、软件测试、软件项目管理、软件架构师、软件质量保证工程师等。 计算机科学与技术 计算机研发工程师、算法工程师、数据科学家、人工智能工程师、机器学…

配置PXE预启动执行环境:使用PXE装机服务器网络引导装机

文章目录 PXE概述PXE批量部署的优点基本的部署过程搭建的前提条件 搭建配置PXE装机服务器1. 准备 CentOS 7 安装源&#xff08;YUM 仓库&#xff09;2. 安装并启用 TFTP 服务3. 安装并启用 DHCP 服务4. 准备 Linux 内核和初始化镜像文件5. 准备 PXE 引导程序6. 安装 FTP 服务并…

中科服务器磁盘未断电状态被人拔插导致raid故障,安装系统找不到系统盘 修复raid再次安装系统成功

1&#xff0c;根据提示按del进入bios 直接回车 改成good状态保存&#xff08;多块盘的话重复此操作即可&#xff0c;直到让盘的状态显示good或者online&#xff09; 然后回到上级导入raid信息 raid信息导入 设置成yes&#xff0c;然后保存退出 然后他会自己同步数据&…

Linux 软件编程多路复用tcp

1.select的缺点&#xff1a; 1.select监听的文件描述符集合是一个数组&#xff0c;有上限&#xff08;1024个&#xff09; 2.select监听的文件描述符集合在应用层&#xff0c;内核层监听事件后需要传递给用户层带来资源开销 3.select需要用户手动查找产生事件的文件…

linux网卡重命名命令

在Linux系统中&#xff0c;网卡重命名的命令是ip命令。下面是在不同Linux发行版上进行网卡重命名的命令示例&#xff1a; 1. Ubuntu/Debian系统&#xff1a; 首先&#xff0c;使用ifconfig命令查看当前系统的网卡名称。 然后&#xff0c;使用以下命令修改网卡名称&#xff1a;…

【Linux】分析一段oom及oops报错日志

oom相关日志分析: Oom-killer错误是因系统内存分配不足&#xff0c;为保障系统正常运行会随机kill掉占用较多的内存进程。 该日志已经输出内存占满相关提示&#xff0c;内存上限为16G&#xff0c;当前已使用16G&#xff0c;内存限制导致分配失败次数为586755次。 OOPS相关日志…

交换排序(冒泡排序和快速排序)

一、基本思想 所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。 交换排序的特点是&#xff1a;将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 二、冒泡排序 1.核心思想 两两相邻的元素进行比…