【问题标题】:Build dynamic closure list from a list in order to pass it to OrderBy in Groovy从列表构建动态闭包列表,以便将其传递给 Groovy 中的 OrderBy
【发布时间】:2018-06-11 10:13:48
【问题描述】:

我正在关注this的文章来设置排序顺序。

摘自上述文章

class Language {
    String name
    boolean dynamic
    String toString() { "name: $name, dynamic: $dynamic" }
}
 
def languages = [
    new Language(name: 'Groovy', dynamic: true),
    new Language(name: 'Java', dynamic: false),
    new Language(name: 'Clojure', dynamic: true)
]
def list = ['name', 'dynamic']
sh = new GroovyShell()
closure = sh.evaluate("{  }")
def cList = list.collect { closure(it) }
println cList
 
// We order first on dynamic property and then name property.
def orderByDynamicAndName = new OrderBy([{ it.dynamic }, { it.name }])

在这里,我想从列表中动态传递闭包列表。

比如说,有一个列表,列表在不同的应用程序/类中的元素大小可能会有所不同这是我想要动态关闭列表的主要原因。

def list = ['name', 'dynamic']

从上面的列表中,想要将其生成为闭包列表并将其作为参数传递给OrderBy类。

//Build closure list. But, not sure how to generate it from above list
def cList = 

def orderByDynamicAndName = new OrderBy(cList)

尝试引用this 线程,但有些无法按需要生成cList

尝试构建cList,如下图;出错

def list = ['name', 'dynamic']
sh = new GroovyShell()
closure = sh.evaluate("{ fieldName -> \"it\".fieldName }")
def cList = list.collect { closure(it) } 

错误:

抛出异常

groovy.lang.MissingPropertyException:没有这样的属性:类的字段名:java.lang.String

如何克服这个问题?

【问题讨论】:

    标签: list groovy closures


    【解决方案1】:
    class Language {
        String name
        boolean dynamic
        String toString() { "name: $name, dynamic: $dynamic" }
    }
    
    def languages = [
        new Language(name: 'Groovy', dynamic: true),
        new Language(name: 'Java', dynamic: false),
        new Language(name: 'Clojure', dynamic: true)
    ]
    
    def list = ['dynamic', 'name']
    def cList = list.collect{ propName-> { target-> target[propName] } }
    
    def orderBy = new OrderBy(cList)
    def sortedLanguages = languages.toSorted(orderBy)
    
    println languages
    println sortedLanguages
    

    其实就是这样的表达方式

    list.collect{ propName-> { target-> target[propName] } }
    

    将属性名称列表转换为闭包列表

    ['dynamic', 'name'] => [ { target-> target['dynamic'] }, { target-> target['name'] } ]
    

    target只是闭包中的一个参数名。

    稍后,当我们调用 sort 时,每个闭包 { target-> target[propName] } 将针对排序数组中的一个对象调用,并且我们的闭包通过属性名称返回值。

    【讨论】:

    • 感谢您的解决方案,将检查它。
    • 您能解释一下解决问题的声明吗?
    【解决方案2】:

    经过反复试验,下面的代码为我工作,以便创建闭包列表。

    def list = ['dynamic', 'name']
    def tempClosureString = list.collect { element -> "{it.$element}" }.join(',')
    def cList = new GroovyShell().evaluate("[ $tempClosureString ]")
    
    def orderByDynamicAndName = new OrderBy(cList)
    

    如果有更好的选择,我欢迎。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多