Groovy系列二 Groovy GDK

news2024/12/23 5:11:16

        

目录

Groovy中自带集合方法

sort方法对集合排序

findAll 查询所有符合条件的元素

collect 返回 一个新的list

inject 强大的累计功能

each、eachWithIndex

find、findIndexOf 查询符合条件的数据

any判断符合条件的数据

every查询所有条件都满足的数据

reverse将集合倒叙返回

first、last、tail查找集合中的元素

通配符 (*.)

GPath对象导航的结构

IO 操作变得更简单

.. 表示 范围

工具

ConfigSlurper配置支持工具

Expando 万能扩展类

属性变化添加监听


        上一篇我们从整体学习了Groovy,从整体上了解了Groovy的概念以及特点。并且通过实践学习了Groovy的相关改变,本篇我们一起学习Groovy的开发工具包,通过相关API的学习更加深入的了解Groovy。

Groovy中自带集合方法

        Groovy的集合和Java的集合是一样的,不同的是集合方法有差异,我们从集合方法开始学习。

sort方法对集合排序

        sort 对集合进行排序,这个方法,可以接收1个闭包作为参数,或者无参数。

// 默认对集合进行正序排序
def lst = [13, 12, 15, 14];
def newlst = lst.sort();//默认排序
println newlst; 
// 结果
[12, 13, 14, 15]

// 适用闭包作为参数自定义排序
def newlist2 = lst.sort {
    a, b -> a - b ? -1 : 1
}
println newlist2; 
//  结果
[15, 14, 13, 12]

findAll 查询所有符合条件的元素

        findAll 返回所有符合条件的元素。它可以接收1个闭包作为参数,或者无参数。

def list = [13, 12, 15, 14,0,-1];
//[13, 12, 15, 14, -1]
println(list)
println(list.findAll())

def newlst = list.findAll();
//[13, 12, 15, 14, -1]
println newlst;

// findAll 闭包作为参数返回小于 13 的所有元素
def newlst2 = list.findAll {
    value -> value < 13
};
println newlst2;
// 结果
//[12, 0, -1]

collect 返回 一个新的list

        collect 返回 一个新的list,它可以接收1个闭包作为参数,或者无参数。

//- collect 返回 一个新的list,它可以接收1个闭包作为参数,或者,无参数,
def list = [13, 12, 15, 14, 0, -1];
def newlst = [];
newlst = list.collect {
    it * 2
}
println newlst
// 结果
// [26, 24, 30, 28, 0, -2]

inject 强大的累计功能

        inject函数具备强大的累计功能,类似JS的reduce方法。其中inject的参数可以无,也可以是个闭包。

// 以"I"方法参数设置给sum, 迭代list 将每个元素设置 elem 和 sum 拼接赋值给sum
def list = ["am", "a", "man"]
def result = list.inject("I") { sum, elem ->
    "$sum $elem"
}
println result
//结果:I am a man

// 以"2"方法参数设置给p, 迭代 [1, 2, 3] 将每个元素设置 e ,计算 p * e 结果赋值给 p
def intRes = [1, 2, 3].inject(2, {
    p, e -> p * e;
});
println(intRes)
// 结果:12

// 不仅仅可以遍历计算列表,实际的业务场景中,比如计算图书馆的库存。可以看到在计算库存的时候 def totalStore。若采用Java计算的话需要定义中间变量,并且需要写when判断逻辑。
class Library {
    private List<BookSeries> bookSeriesList;
}

class BookSeries {
    private int suitNum;
    private List<Book> books;
}

class Book {
    private String name;
    private int store;
    private double price;
}

def library = new Library(
        bookSeriesList: [
                new BookSeries(suitNum: 1, books: [
                        new Book(name: "水浒传(上)", store: 1, price: 100.00),
                        new Book(name: "水浒传(中)", store: 2, price: 120.00),
                        new Book(name: "水浒传(下)", store: 3, price: 150.00),
                ]),

                new BookSeries(suitNum: 2, books: [
                        new Book(name: "三国演义(上)", store: 4, price: 100.00),
                        new Book(name: "三国演义(中)", store: 5, price: 120.00),
                        new Book(name: "三国演义(下)", store: 6, price: 150.00),
                ]),

                new BookSeries(suitNum: 3, books: [
                        new Book(name: "西游记(上)", store: 7, price: 100.00),
                        new Book(name: "西游记(中)", store: 8, price: 120.00),
                        new Book(name: "西游记(下)", store: 9, price: 150.00),
                ]),

                new BookSeries(suitNum: 4, books: [
                        new Book(name: "红楼梦(上)", store: 10, price: 100.00),
                        new Book(name: "红楼梦(中)", store: 11, price: 120.00),
                        new Book(name: "红楼梦(下)", store: 12, price: 150.00),
                ]),

                new BookSeries(suitNum: 0, books: [
                        new Book(name: "大秦帝国(上)", store: 10, price: 100.00),
                        new Book(name: "大秦帝国(中)", store: 10, price: 120.00),
                        new Book(name: "大秦帝国(下)", store: 10, price: 150.00),
                ]),
        ]
)
when: "统计图书馆丛书总库存"
def totalStore = library.bookSeriesList.inject(0) { libraryTotalStore, bookSeries ->
    libraryTotalStore + (bookSeries.suitNum > 0 ? bookSeries.books.store.sum() * bookSeries.suitNum : 0)
}
println totalStore

each、eachWithIndex

        each普通迭代方法,eachWithIndex用法和each一样,唯一的不同是eachWithIndex的传入的闭包,有两个参数,第一个是值,第二个是索引。

def list = ["a", "b", "c"]

list.eachWithIndex {
    String v, int index ->
        println v;
        println index
}
//结果:
a
0
b
1
c
2

find、findIndexOf 查询符合条件的数据

//- find 返回第一个符合条件的元素,它可以接收1个闭包作为条件参数,或者无参数。
// 没有设置参数,默认返回第一个
def list = ["a", "b", "c"]
def str = list.find();
println(str)

// 设置闭包参数,默认符合条件的那个
str = list.find({e -> e == "b"})
println(str)
// 设置闭包参数,闭包参数使用默认的关键字 it
str = list.find({it == "b"})
println(str)

//- findIndexOf 返回指定元素的索引值。它可以接收1个闭包作为条件参数。
index = list.findIndexOf({it == "b"})
println(index)

//结果:
a
b
b
1

any判断符合条件的数据

//- any 返回boolean值。只要有任意一个符合条件就返回true,它可以接收1个闭包作为条件参数,或者无参数。
def list = ["a", "b", "c"]
def result = list.any();
println(result)
result = list.any({it == "e"});
println(result)

//结果 
true
false

every查询所有条件都满足的数据

//- every 返回boolean值,只有所有符合条件才返回true,它可以接收1个闭包作为条件参数,或者无参数。
def list = ["a", "b", "c"]
def result = list.every();
println(result)
result = list.every({it == "a" || it == "b" || it == "c"});
println(result)
result = list.every({it == "a"});
println(result)
result = list.every({it == "e"});
println(result)

// 结果:
true
true
false
false

reverse将集合倒叙返回

//- reverse, 它将原list倒序,返回新list。无参数
def list = ["a", "b", "c"]
list = list.reverse();
println(list)

//结果:
[c, b, a]

first、last、tail查找集合中的元素

//- first 返回原list的第一个元素,无参数
def list = ["a", "b", "c"]
def result = list.first();
println(result)

//- last 返回原list的最后一个元素,无参数
result = list.last();
println(result)

//- tail 返回一个新list,这个list包含原list(除第一个元素)的所有元素,无参数
list = list.tail();
println(list)

// 结果:
a
c
[b, c]

        其它的 groupBy,tokenize, unique,max,min,count,sum 等的函数以后有时间在尝试练习。

通配符 (*.)

        在Groovy中我们可以使用通配符(*.)提取我们想要的信息,就想使用Linux命令查询查看某文件类型目录时的通配符一样(ls *.txt)。我们定义一个类,实例化2个Car对象,采用通配符查询每一个实例对象中的make属性。

class Car {
    String make
    String model
}
def cars = [
        new Car(make: 'Peugeot', model: '508'),
        new Car(make: 'Renault', model: 'Clio')]
def makes = cars*.make

makes.each {
    println it
}

//结果:
Peugeot
Renault

// 创建一个1到10元素的列表,并且每个元素都乘以2
def list = (1..10)*.multiply(2)
println list

// 结果:
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

// 将列表中的所有的字符串转大写
def list = ['Denver', 'Cheyenne', 'Reno', 'Sacramento']*.toUpperCase()
println(list)

// 结果:
[DENVER, CHEYENNE, RENO, SACRAMENTO]

GPath对象导航的结构

        GPath是groovy代码的一个强劲对象导航的结构,名称的选择与XPath相似,XPath是一个用来描述XML(和等价物)文档的标准。正如XPath,GPath的目标是用在表达试:明确的,紧凑易读的表达式。当染改方式也被封装到Collection的GDK方法中。

// GPath  像XPath一样,可以轻松的访问多层的集合对象,如下我们定义一个 List<Map<String, Integer>> 类型,快速的获取他的某个健值对。
def listOfMaps = [['a': 11, 'b': 12], ['a': 21, 'b': 22], null]
println(listOfMaps.a);// [11, 21]

// 结果:
[11, 21]

// 我们看到最后一个元素是 null 无法获取到,但是我们使用通配符就可以
listOfMaps = [['a': 11, 'b': 12], ['a': 21, 'b': 22], null]
println(listOfMaps*.a)

// 结果:
[11, 21, null]

//采用Collection的GDK方法调用,可以看到是等价于 list*.a 的
def list = listOfMaps.collect { it?.a }
println(list)

  // 结果:
 [11, 21, null]

IO 操作变得更简单

// groovy可以简单明了的进行文件读写操作
//* 写入一个文件内容:
// 创建文件,并写入
new File("book.txt").text = "lly";

//* 读取一个文件内容
println new File("book.txt").text

//* 也可以通过字节方式写入
//先手动创建data文件
byte[] data = new File("data").bytes;
//把data的数据写入book2.txt
new File("book2.txt").bytes = data;

//创建 dragons.txt.txt 写入内容后,并读取dragons.txt内容
new File('dragons.txt').eachLine { line-> println(line)   }

//* 如果需要用InputStream,Reader,OutputStream,Writer这些对象进行操作。groovy也提供类似的方法
//- 输入流InputStream操作
Properties properties = new Properties()
File propertiesFile = new File('/Users/liluyang/llyCode/groovy 2/src/main/resources/application.properties')
propertiesFile.withInputStream {
    properties.load(it)
}
println properties.lly
println properties.yangzai

// 结果:
lly
曾经的屠龙少年
如今变成了恶龙
handsome
handsome too

//- Reader操作
def lineNo = 1
def line = 1;
new File("dragons.txt").withReader { reader ->
    while ((line = reader.readLine()) != null) {
        println "第${lineNo}行内容: ${line}"
        lineNo++
    }
}

// 结果:
第1行内容: 曾经的屠龙少年
第2行内容: 如今变成了恶龙

//- OutputStream操作
// 文件复制
def srcFile = new File("dragons.txt")
def targetFile = new File("book.txt")
targetFile.withOutputStream { outputStream ->
    srcFile.withInputStream { inputStream ->
        outputStream << inputStream
    }
}

//- 写入Writer操作
//写入
new File('book.txt').withWriter('utf-8', {
    writer -> writer.writeLine 'Hello World'
});

//精简版
new File('book.txt') << '''Into the ancient pond
    A frog jumps
    Water’s sound!'''

//## 极简的URLs操作
//1.数据抓取
URL url = new URL("https://www.baidu.com/");
InputStream input = (InputStream) url.getContent();
ByteArrayOutputStream out = new ByteArrayOutputStream();

int n = 0;
byte[] arr = new byte[1024];

while (-1 != (n = input.read(arr)))
    out.write(arr, 0, n);
System.out.println(new String(out.toByteArray()));

.. 表示 范围

        在groovy中。范围运算,可以用在循环,switch,字符串截取中。

1..10 - 包含范围的示例

1 .. <10 - 独占范围的示例

'a'..'x' - 范围也可以由字符组成

10..1 - 范围也可以按降序排列

'x'..'a' - 范围也可以由字符组成并按降序排列

// 打印 1 到 10 数字
(1..10).each { println(it)}

// 打印 1 到 100 数字
for (def i in 1..100){
    println(i)
}

// 定义字符串,打印[0..4]范围字符串,打印 [0..4, 8..-1] 下标0到下表4的字符串范围,和下标为8到最后的字符串范围
def text = 'learning groovy'
println text[0..4]
println text[0..4, 8..-1]

// 结果:
learn
learn groovy

def list = ['hank', 'john', 'fred']
println list[0..1] //[hank, john]

// 打印数字 1 到小于 5 的数字
(1..<5).each { println(it) }

工具

ConfigSlurper配置支持工具

        ConfigSlurper工具用于读取配置文件非常的方便,支持自定义配置文件。我们在Groovy中自定义了一段字符串,按照配置文件的格式读取它。

//- ConfigSlurper工具用于读取配置文件非常的方便
def config = new ConfigSlurper().parse('''
     app.date = new Date()
     app.age = 42
     app {
      name = "Test ${this.age}"
    }
     ''')
def properties = config.toProperties()
println(properties."app.date")
println(properties."app.age")
println(properties."app.name")

// 结果:
Sun May 28 19:04:39 CST 2023
42
Test 42

Expando 万能扩展类

        我之所以这么描述,是这个类台太强大了。Expando类是Groovy语言中的一个相当有趣的类,它的作用类似于GroovyBean类,但比GroovyBean类更加灵活。同时它还更类似于Map类,但也比Map类更加灵活。可以自定义属性和灵活赋值。


//1.
def expando = new Expando()
expando.name = { -> "abc" }
expando.say = { String s -> "${expando.name} says: ${s}" }
println expando.say('hello')

//2.
def person = new Expando()
person.name = 'Alice'
person.age = 18

person.description = {
    println """
               ----------description---------
                   name: ${delegate.name}
                   age:  ${delegate.age}
               ------------------------------
             """
}
person.description()

//结果:
abc says: hello

               ----------description---------
                   name: Alice
                   age:  18
               ------------------------------

属性变化添加监听

        在Groovy中,可以主动监听各种集合对象变化的事件,并作自己的处理。下面以List集合为例,定义监听者ObservableList,并且绑定处理事件函数。就可以在改集合发生变化的时候调用处理函数了。

def list = new ObservableList()
def printer = { e -> println e.class }
list.addPropertyChangeListener(printer)
list.add 'Harry Potter'
list.add 'Hermione Granger'
list.remove(0)

// 结果:
class groovy.util.ObservableList$ElementAddedEvent
class java.beans.PropertyChangeEvent
class groovy.util.ObservableList$ElementAddedEvent
class java.beans.PropertyChangeEvent
class groovy.util.ObservableList$ElementRemovedEvent

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

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

相关文章

linux下安装EclipseCDT:离线安装与在线安装

文章目录 前言&#xff1a;1. 离线下载1.1 下载EclipseCDT1.2 下载jdk1.3 安装jdk1.4 安装eclipse 2. 在线安装&#xff1a;2.1 安装jdk2.2 安装EclipseCDT2.2.1 简单安装2.2.2 ubuntu官方推荐安装方式2.2.3 apt安装(报错logo) 总结&#xff1a; 前言&#xff1a; Eclipse使用…

ChatGPT对软件测试的影响

本文首发于个人网站「BY林子」&#xff0c;转载请参考版权声明。 ChatGPT是一个经过预训练的AI语言模型&#xff0c;可以通过聊天的方式回答问题&#xff0c;或者与人闲聊。它能处理的是文本类的信息&#xff0c;输出也只能是文字。它从我们输入的信息中获取上下文&#xff0c;…

Spring 日志文件

日志 日志是程序的重要组成部分,日志可以:a.记录错误日志和警告日志(发现和定位问题)b.记录用户登录日志,方便分析用户是正常登录还是恶意破解用户c.记录系统的操作日志,方便数据恢复和定位操作人d.记录程序的执行时间,方便为以后优化程序提供数据支持 日志使用 SpringBoot …

东风/小米投资!去年EHB出货20万台,这家公司获科技进步一等奖

5月26日上午&#xff0c;2022年度上海市科学技术奖励大会在上海展览中心中央大厅召开&#xff0c;隆重表彰为国家、为上海科技事业和现代化建设作出突出贡献的科技工作者。同驭汽车与同济大学等单位联合申报的“汽车线控制动系统关键技术及产业化”项目获得科技进步奖项目一等奖…

【CCNP | 网络模拟器GNS系列】安装、配置和使用 GNS3

目录 1. 下载 GNS31.1 GitHub下载&#xff08;推荐&#xff09;1.2 官方下载&#xff08;示例&#xff09; 2. 安装GNS3&#xff08;1&#xff09;进入GNS3设置界面&#xff08;2&#xff09;许可协议&#xff08;3&#xff09;选择启动目录文件夹&#xff08;4&#xff09;选择…

ArcGIS中制作一张985、211院校分布图

一、数据来源及介绍 1.985、211院校名录 985、211院校名录主要来源于网络。 2.行政边界数据 行政边界数据来源于环境资源科学与数据中心&#xff08;中国科学院资源环境科学与数据中心 (resdc.cn)&#xff09;&#xff0c;该网站包含我们国家任何一个省市的行政边界&#xf…

2024考研408-计算机组成原理第二章-数据的表示

文章目录 一、数制与编码1.1、进位计数制1.1.1、计数方法&#xff08;最古老计数方法、十进制计数、r进制计数&#xff09;1.1.2、进制转换①任意进制转为十进制②二进制转八进制、十六进制③八进制、十六进制转二进制④十进制转任意进制&#xff08;包含整数、小数&#xff0c…

Python绘图神器Plotly安装、使用及导出图像教程

1. Plotly安装 Plotly 是一个快速完善并崛起的交互式的、开源的绘图库库&#xff0c;Python 库则是它的一个重要分支。现已支持超过40种独特的图表类型&#xff0c;涵盖了广泛的统计、金融、地理、科学和三维用例。 Python 中可以使用 pip 或者 conda 安装 Plotly&#xff1a…

使用校园账号登录WOS(Web of Science)并检索文献

使用校园账号登录WOS&#xff08;Web of Science&#xff09;并检索文献 写在最前面登录WOS检索文献文献检索文献检索结果分析文章类型&#xff08;Document Types&#xff09;发表年份&#xff08;Publication years&#xff09;期刊&#xff08;Publication/Source Titles&am…

chatgpt赋能python:Python中n个数相加–实现简单、计算准确

Python中n个数相加 – 实现简单、计算准确 Python是一门功能强大的编程语言&#xff0c;能够在各个领域得到广泛应用。在数据处理和科学领域&#xff0c;Python是最受欢迎的编程语言之一。在Python中&#xff0c;n个数相加是一种常见的操作&#xff0c;它可以在数据处理中做到…

计算机网络六 应用层

应用层 网络应用模型 客户/服务器模型(C/S) 客户/服务器模型是一种常见的网络应用模型。客户端是指与用户直接交互的计算机应用程序&#xff0c;服务器则是提供服务的计算机系统或应用程序。在客户/服务器模型中&#xff0c;客户端发送请求&#xff0c;服务器端回应请求。客户…

Redis7实战加面试题-高阶篇(案例落地实战bitmap/hyperloglog/GEO)

案例落地实战bitmap/hyperloglog/GEO 面试题&#xff1a; 抖音电商直播&#xff0c;主播介绍的商品有评论&#xff0c;1个商品对应了1系列的评论&#xff0c;排序展现取前10条记录 用户在手机App上的签到打卡信息:1天对应1系列用户的签到记录&#xff0c;新浪微博、钉钉打卡签…

ADC和DAC常用的56个技术术语

采集时间 采集时间是从释放保持状态(由采样-保持输入电路执行)到采样电容电压稳定至新输入值的1 LSB范围之内所需要的时间。采集时间(Tacq)的公式如下&#xff1a; ​混叠 根据采样定理&#xff0c;超过奈奎斯特频率的输入信号频率为“混叠”频率。也就是说&#xff0c;这些频…

一图看懂 importlib_metadata 模块:用于提供第三方访问Python包的元数据的库,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 importlib_metadata 模块&#xff1a;用于提供第三方访问Python包的元数据的库&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9ca;模块…

rpm 方式部署 MongoDB

文章目录 rpm 方式部署 MongoDB1. 下载 rpm 包2. 上传到服务器3. 执行安装4. 启动5. 登陆6. 开启远程登陆7. 测试远程登陆8. 开启 auth 认证9. 远程登陆验证 rpm 方式部署 MongoDB 参考地址&#xff1a;https://blog.csdn.net/baidu_23491131/article/details/127664931 1. 下载…

PixiJS 源码深入解读:用于循环渲染的 Ticker 模块

大家好&#xff0c;我是前端西瓜哥。这次来看看 PixiJS 的 Ticker 模块源码。 Ticker 的作用是 在下一帧绘制前调用监听器&#xff0c;PixiJS 使用它来不断对画面进行重绘。 版本为 7.2.4。 使用 在我们 实例化 PIXI.Application 时&#xff0c;PIXI.Application 内部注册的…

国内免费可用的ChatGPT网站【实时更新】

文章目录 1.什么是ChatGPT2.ChatGPT的基础技术3.ChatGPT工作原理4.ChatGPT应用场景5.ChatGPT局限性6.ChatGPT的未来发展7.国内免费ChatGPT镜像写在最后 ChatGPT国内能用吗&#xff1a;ChatGPT在国内是无法使用的。你肯定要问我怎样才能体验到ChatGPT的神奇魔力呢&#xff1f;文…

Linux-0.11 kernel目录进程管理system_call.s详解

Linux-0.11 kernel目录进程管理system_call.s详解 模块简介 本节主要介绍了在Linux-0.11中关于系统调用的相关实现。Linux-0.11使用int 0x80中断以及eax寄存器中存储的功能号去调用内核中所提供的功能&#xff0c;在系统调用发生的过程中伴随着用户态向内核态的主动切换。 需…

App开发需要了解的基本开发技术

近年来&#xff0c;随着智能手机的普及和互联网的高速发展&#xff0c;移动端 APP应用开发越来越受到人们的欢迎。现在&#xff0c;应用程序开发已成为一项热门职业&#xff0c;并成为许多人寻求高薪职业的首选。然而&#xff0c;要成功地在移动端 APP中应用程序&#xff0c;开…

分享几封好用的外贸人催单模版

给外贸人说在前面&#xff1a; 虽然说是催单模版&#xff0c;但是请带入你们公司产品&#xff0c;你们客户具体情况来套入&#xff0c;不能一模一样&#xff0c;再好的模版&#xff0c;再好的话术&#xff0c;大家一起用&#xff0c;就成了毫无价值的废料。 请灵活运用&#…