这是groovy collect闭包的缩写吗?

w46czmvw  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(207)

我研究了处理json解析的groovy代码,发现了以下我无法理解的奇怪代码:
列表.groovy

def lst = [
    [name: 'Bill', age: 30],
    [name: 'Jobs', age: 40],
    [name: 'Steve', age: 50],
]

println lst
println lst.name
println lst.collect{it.name}
println lst.age
println lst.agenda

平台:Windows10,groovy版本:2.5.9

C:\chenchang\study\groovy_study\closure>groovy -version
Groovy Version: 2.5.9 JVM: 1.8.0_272 Vendor: AdoptOpenJDK OS: Windows 10

groovy脚本的输出:

C:\chenchang\study\groovy_study\closure>groovy list.groovy
[[name:Bill, age:30], [name:Jobs, age:40], [name:Steve, age:50]]
[Bill, Jobs, Steve]
[Bill, Jobs, Steve]
[30, 40, 50]
[null, null, null]

我不明白 lst.name 部分。看起来像 lst.collect{it.name} 但我找不到任何参考文件或正式解释。有人能解释一下groovy语法是什么吗?
在审阅了您的评论之后,我更新了示例代码,发现了一些以前不知道的新知识。

def lst = [
    [name: 'Bill', age: 30],
    [name: 'Jobs', age: 40],
    [name: 'Steve', age: 50],
    null, // I add a null value in the list
]
println lst
println lst.name
println lst.findAll{ it != null }.collect{ it.name }
println lst*.name
/* println lst.collect{ it.name } */
/* java.lang.NullPointerException: Cannot get property 'name' on null object */
println lst.collect{ it?.name }

修改后的groovy脚本的输出:

C:\chenchang\study\groovy_study\closure>groovy list.groovy
[[name:Bill, age:30], [name:Jobs, age:40], [name:Steve, age:50], null]
[Bill, Jobs, Steve]
[Bill, Jobs, Steve]
[Bill, Jobs, Steve, null]
[Bill, Jobs, Steve, null]
``` `lst.name` 是忽略空值的gpath。因此,如果原始列表包含空值,则返回的新列表的长度将小于原始列表的长度。 `lst.name` 相当于 `lst.findAll{ it != null }.collect{ it.name }` . `lst*.name` 是 `spread dot operator` 或星点运算符。返回的新列表的长度等于原始列表的长度。如果原始列表中的某些值 `null` ,则新列表中的相应值将为null和no `NullPointerException` 将被抛出。 `lst*.name` 相当于 `lst.collect{ it?.name }` .
wkyowqbh

wkyowqbh1#

它是集合的gpath符号。
gpath可用于处理xml、json和集合等数据。

0qx6xfy6

0qx6xfy62#

def lst = [] 是java.util.arraylist
你可以用 println lst.getClass() 检查一下 ArrayList 工具 Iterable , Collection , ... 和其他接口
groovy可以在任何级别的超级接口或超级类上添加功能。
groovygdk文档解释了groovy添加到java中的其他功能
要获得groovy中所有可用方法的列表,您必须检查javadoc和groovydoc的所有超类/接口。
万一 lst.name groovy实际上 lst.getAt('name') getat(字符串键)-可以在groovy文档集合中找到
最后是一篇关于groovy集合的文档:http://docs.groovy-lang.org/next/html/documentation/working-with-collections.html

相关问题