[英]Filter java.util.Collection in Java
我寫了一個util類來過濾java.util.Collection
元素,如下所示:
public class Util{
public static <T> void filter(Collection<T> l, Filter<T> filter) {
Iterator<T> it= l.iterator();
while(it.hasNext()) {
if(!filter.match(it.next())) {
it.remove();
}
}
}
}
public interface Filter<T> {
public boolean match(T o);
}
問題:
你應該允許任何Filter<? super T>
Filter<? super T>
不僅僅是Filter<T>
。
客戶端可能還希望有一個返回新Collection的方法:
public static <T> Collection<T> filter(Collection<T> unfiltered,
Filter<? super T> filter)
Predicate
實現過濾的Iterables.filter(iterableCollection, predicate)
是否必要取決於您想要達到的目標。 如果您可以使用其他第三方庫,例如Google Collections,那么沒有。 如果它計划是一次性的,那么可能不是。 如果你計划創建不同的過濾器,那么,看起來是一種保持模塊化和凝聚力的好方法。
一個建議 - 您可能想要返回一個Collection - 這樣,您可以選擇返回一個新的過濾Collection而不是改變原始Collection。 如果您需要在並發上下文中使用它,這可能很方便。
您也可以查看對此類問題的回答 。
看起來不錯 - 但我們無法決定,是否“必須”編寫它(好吧,你真的寫了它;))
remove()
方法並不總是實現,它被標記(可選) 。 一些迭代器只是拋出UnsupportedOperationException
。 您應該捕獲它或將其轉換為自定義異常,說明此集合無法過濾。
然后你可以將方法簽名更改為
public static <T> void filter(Iterable<T> i, Filter<T> filter)
因為迭代器不僅限於集合。 使用此實用程序方法,您可以篩選提供允許刪除操作的迭代器的每個“容器”。
你認為有必要編寫這個方法嗎?
如果您不介意使用第三方庫,那么不。
對提供此功能的第三方庫的一些建議:
您可能希望查看Functional Java ,它提供了filter
以及真藍色函數語言中的許多其他高階函數。
例:
List<Person> adults = filter(people, new F1<Person, Boolean>() {
public Boolean f(Person p) {
return p.getAge() > 18;
}
});
另一種選擇是使用lambdaj - 一個具有相似目標的庫,但比Functional Java更簡潔。 lambdaj並沒有像Functional Java那樣覆蓋那么多。
例:
List<Person> adults = filter(having(on(Person.class).getAge(), greaterThan(18)), people);
關於問題1,已經有很多收集庫。 過濾由apache common-collections CollectionUtils和google collection Iterables提供 。
我認為在Filter<T>
界面中定義一個visit(T o)
方法會很酷。 這樣,過濾器實現可以決定在匹配時對訪問對象采取什么操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.