首先,我要指出的是,如果你只是想要一個新ArrayList
包含匹配的元素,你這樣做是在您的示例的方式就好了。在Java有lambda表達式之前,你不會比它更簡單或者更好看。
既然你這個標記與guava,這裏是你如何能與番石榴做到這一點。你基本上過濾了謂詞組成中的原始列表(== Color.Red
)和函數(pojo.getColour()
)。所以,如果你有一個靜態的最終Function<Pojo, Colour>
稱爲COLOUR
上Pojo
(像這樣):
public static final Function<Pojo, Colour> COLOUR =
new Function<Pojo, Colour>() {
@Override public Colour apply(Pojo input) {
return input.getColour();
}
};
您可以創建像這樣的組合:
Predicate<Pojo> isRedPojo = Predicates.compose(
Predicates.equalTo(Colour.Red), Pojo.COLOUR);
然後,您可以創建原始表的篩選視圖:
Iterable<Pojo> redPojos = Iterables.filter(pojoList, isRedPojo);
而你可以被過濾視圖複製到一個ArrayList
如果你想:
List<Pojo> copy = Lists.newArrayList(redPojos);
apache commons-collections也有很好的工具。 Collection filtered = CollectionUtils.filter(pojoCollection,new Predicate(){...}); –
Matt
2012-03-20 17:52:12
@Matt:我認爲commons-collections過濾器方法_removes_元素與原始集合不匹配,我不太喜歡。番石榴有更明確的名稱'Iterables.removeIf(Iterable,Predicate)'方法來做到這一點。 – ColinD 2012-03-20 18:12:49
你能指定'Function'的外觀嗎? – hakunami 2015-07-14 06:40:32