簡體   English   中英

在Java中過濾java.util.Collection

[英]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);
}

問題:

  1. 你認為有必要編寫這個方法嗎?
  2. 有關方法的任何改進?

你應該允許任何Filter<? super T> Filter<? super T>不僅僅是Filter<T>

客戶端可能還希望有一個返回新Collection的方法:

public static <T> Collection<T> filter(Collection<T> unfiltered, 
    Filter<? super T> filter)
  1. 沒有。 番石榴庫已經具備此功能。 請參閱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM