您可以爲它編寫自己的代碼,這將爲您在應用過濾器的每個位置(以util類中更多代碼爲代價)節省幾行代碼。您的電話是否值得或不...
在一個地方:
public interface Filter<T> {
boolean select(T t);
}
public static <E> List<E> select(Collection<? extends E> es, Filter<? super E> filter) {
final List<E> result = new ArrayList<E>();
for (E e : es) {
if (filter.select(e)) {
result.add(e);
}
}
return result;
}
和謂詞:
private static class Filter<User> selectedUserFilter = new Filter<User>() {
public boolean select(User user) {
return user.isSelected();
}
};
Aaaand:
final List<User> selectedUsers = Util.select(this.getUsers(), selectedUserFilter);
同樣,你結束最後只有一行代碼,代價是其他地方的代碼更多。
你在這裏得到的代碼與在Java中選擇一個新的集合時一樣好。即使你使用Google Collections這樣的東西,你也會得到更多的代碼。 – msandiford 2010-05-17 05:20:40
代碼很好,但arrayConstructor(initialCapacity)的0參數可能無用,可能會令人困惑(有些人會混淆容量和大小)。使用空構造函數更簡單和乾淨。 – leonbloy 2010-05-17 11:37:01
您的列表'selectedUsers'包含'User'實例,所以除非您的'user.getId()'方法返回一個用戶(不太可能)''selectedUsers.add(user.getId())'不會編譯。改爲嘗試'selectedUsers.add(user)'。 – 2011-03-27 12:32:19