我有以下groovy功能:
def getDependantLibs(updatedLib) {
def dependants = []
getAllLibs().each { lib ->
try {
def ref = getFromStash("/repos/${lib}/dependencies.json").find { it.name == updatedLib }
if (ref != null) {
dependants.add([ name: lib, version: ref.version ])
}
} catch (err) {}
}
return dependants
}
我的问题是,我能否以更优雅的方式实现这一目标(可能使用像收集,展平等常规Collecion功能......)
答案 0 :(得分:1)
是的,您可以使用collectMany
。 E.g:
def deps = [1,2,3,4]
println deps.collectMany{
try {
if (it&1) {
throw new RuntimeException(it.toString())
}
(0..it).collect{
[x: it]
}
}
catch (Exception e) {
println "failed: $e.message"
return []
}
}
// output:
// failed: 1
// failed: 3
// [[x:0], [x:1], [x:2], [x:0], [x:1], [x:2], [x:3], [x:4]]
答案 1 :(得分:0)
您可以利用Collection.each(Closure closure)
将列表中的每个元素从一种格式转换为另一种格式而不是Collection.collect(Closure transform)
来过滤最终列表中的null
元素,而不是使用Collection.findAll(Closure predicate)
。像这样:
def getDependantLibs(updatedLib) {
return getAllLibs().collect { lib ->
try {
[lib: lib, ref: getFromStash("/repos/${lib}/dependencies.json").find { it.name == updatedLib }]
} catch (err) {
[lib: lib, ref: null]
}
}.findAll { it.ref != null }.collect { [name: it.lib, version: it.ref.version] }
}
您始终可以将Java 8 Stream API与Groovy一起使用。在这种情况下使用Stream API的主要优点是流上的所有操作都是惰性的 - 它们在调用reduction function时执行。这意味着您可以应用n次转换,并且只会触发一次迭代。在Groovy中如果你申请使用3个批量收集方法,Groovy将迭代3次。
下面您可以找到在Groovy中使用Java 8 Stream API的示例:
def getDependantLibsWithStream(updatedLib) {
return getAllLibs().stream()
.map({ lib ->
try {
[lib: lib, ref: getFromStash("/repos/${lib}/dependencies.json").find { it.name == updatedLib }]
} catch (err) {
[lib: lib, ref: null]
}
})
.filter({ it.ref != null })
.map({ [name: it.lib, version: it.ref.version] })
.collect(Collectors.toList())
}
我希望它有所帮助。