Groovy:更优雅的方式实现这一目标?

时间:2017-09-01 13:30:18

标签: groovy

我有以下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功能......)

2 个答案:

答案 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

您始终可以将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())
}

我希望它有所帮助。