在代码中简化列表`grep`工具

时间:2016-04-28 07:39:49

标签: groovy

我希望获得具有特定条件的所有ClassNode字段。 在我的代码中,它看起来像这样:

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

有没有办法让它变得更好?我的意思是摆脱grep块内的几个条件语句?

1 个答案:

答案 0 :(得分:2)

您可以稍微提前获取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']

当谈到条件本身时,这可能会更短一点:

"projects": [
    "test",
    "src",
    ".\\src\\Web\\Plugins"  
  ],  

请记住,后者 - 即使它更加时髦 - 人类可能不太可读,而这些人主要使用代码;)