2016-04-28 46 views
1

我想获得所有ClassNode字段的一定条件。 在我的代码,它看起来是这样的:简化代码中的`grep`设施

listener.classNode.fields.grep { 
    !it.name.startsWith('$') && 
    !it.name.startsWith('_') && 
    !it.name.equals('metaClass') && 
    !it.name.startsWith('this') 
}.collect{ it.name } 

有没有一种方法,使其更好?我的意思是摆脱grep区块内的那些条件陈述?

回答

2

你可以把它短一点与获得name值早一点:

listener.classNode.fields*.name.grep { 
    !it.startsWith('$') && 
    !it.startsWith('_') && 
    !it.equals('metaClass') && 
    !it.startsWith('this') 
} 

当谈到病情本身,这可能会短一点:

assert ['$a', '_a', 'metaClass', 'this', 'FOUND'].grep { n -> 
    !['$', '_', 'this'].any { a -> n.startsWith(a) } && 
    !n.equals('metaClass') 
} == ['FOUND'] 

记住后者 - 即使它更加小巧 - 可能不太容易被人读取,而这些人是主要与代码一起工作的人)

+0

我的目标只是我能理解的幻想代码,所以人类readab我不打扰我。 – lapots