加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy属性迭代

发布时间:2020-12-14 16:37:56 所属栏目:大数据 来源:网络整理
导读:在下面的Groovy代码中,将Foo实例的feck,ass,drink属性的值替换为Foo2的实例的值 class Foo { def feck = "fe" def arse = "ar" def drink = "dr" }class Foo2 { def feck = "fe2" def arse = "ar2" def drink = "dr2"}def f = new Foo()def f2 = new Foo2
在下面的Groovy代码中,将Foo实例的feck,ass,drink属性的值替换为Foo2的实例的值

class Foo {
    def feck = "fe"
    def arse = "ar"
    def drink = "dr"    
}

class Foo2 {

    def feck = "fe2"
    def arse = "ar2"
    def drink = "dr2"
}


def f = new Foo()
def f2 = new Foo2()


["feck","arse","drink"].each {it ->
    f."$it" = f2."$it"
}

有没有更好的方法来做到这一点?我对上述代码的具体关注是,属性名称作为字符串存储在列表中,当(例如)使用重构IDE更改这些属性名称之一时,这可能会被错过。

解决方法

我还没有找到一个排除只读属性(即,metaClass,class)的好方法,但是如果要设置Foo实例中也在Foo2实例中的所有属性的值,您可以执行以下。

class Foo {
    def feck = "fe"
    def arse = "ar"
    def drink = "dr"    
}

class Foo2 {

    def feck = "fe2"
    def arse = "ar2"
    def drink = "dr2"
}


def f = new Foo()
def f2 = new Foo2()


f2.properties.each { prop,val ->
    if(prop in ["metaClass","class"]) return
    if(f.hasProperty(prop)) f[prop] = val
}

assert f.feck == "fe2"
assert f.arse == "ar2"
assert f.drink == "dr2"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读