2016-04-28 70 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