java中的筛选java.util.Collection

java中的筛选java.util.Collection,java,collections,Java,Collections,我编写了一个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())

我编写了一个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);
}
公共类Util{
公共静态空隙过滤器(集合l,过滤器过滤器){
迭代器it=l.Iterator();
while(it.hasNext()){
如果(!filter.match(it.next())){
it.remove();
}
}
}
}
公共接口过滤器{
公共布尔匹配;
}
问题:

  • 你认为有必要写这个方法吗
  • 这个方法有什么改进吗

  • 我认为在
    Filter
    界面中定义
    visit(to)
    方法会很酷。这样,当存在匹配项时,过滤器实现可以决定对访问对象采取什么操作。

    是否有必要取决于您想要实现什么。如果您可以使用其他第三方LIB,如Google Collections,则不会。如果计划一次性使用,则可能不会。如果您计划创建不同的过滤器,那么是的,看起来是一个保持模块化和内聚性的好方法

    一个建议是,您可能希望返回一个集合,这样,您就可以选择返回一个新的筛选集合,而不是修改原始集合。如果您需要在并发上下文中使用它,这可能很方便


    您还可以查看对的回复。

    看起来不错,但我们无法决定是否“有必要”编写它(好的,您确实编写了它;)

    remove()。一些迭代器只是抛出一个
    不支持的操作异常
    。您应该捕获它或将其转换为自定义异常,说明无法筛选此集合

    然后您可以将方法签名更改为

    public static <T> void filter(Iterable<T> i, Filter<T> filter)
    
    公共静态空隙过滤器(Iterable i,过滤器)
    
    因为迭代器不限于集合。使用此实用程序方法,您可以过滤提供允许删除操作的迭代器的每个“容器”

    你认为有必要写这个方法吗

    如果您不介意使用第三方库,则不介意

    对提供此功能的第三方库的一些建议:

    您可能想看看哪个提供了
    filter
    以及在真正的blue函数语言中发现的许多其他高阶函数

    例如:

    List<Person> adults = filter(people, new F1<Person, Boolean>() {
      public Boolean f(Person p) {
        return p.getAge() > 18;
      }
    });
    
    List<Person> adults = filter(having(on(Person.class).getAge(), greaterThan(18)), people);
    
    List成人=过滤器(人物,新F1(){
    公共布尔f(个人p){
    返回p.getAge()>18;
    }
    });
    
    另一种选择是使用-一个具有类似目标但比函数Java简洁得多的库。尽管如此,lambdaj并没有涵盖功能性Java那么多的领域

    例如:

    List<Person> adults = filter(people, new F1<Person, Boolean>() {
      public Boolean f(Person p) {
        return p.getAge() > 18;
      }
    });
    
    List<Person> adults = filter(having(on(Person.class).getAge(), greaterThan(18)), people);
    
    List成人=过滤器(有(on(Person.class).getAge(),大于(18)),人);
    
  • 否。已具有此功能。请参见
    谓词
    实现过滤的位置

  • 关于问题1,已经有很多藏书图书馆。apache common collections和google collections按实例提供过滤功能。

    您应该允许任何
    过滤功能