2012-06-27 2 views
3

Я пишу небольшое приложение, которое должно выполнять общую задачу во множестве разных списков: Фильтрация объектов по заданным критериям.Есть ли способ фильтрации в Java, подобный grep()?

Например есть более ArrayList класса Foo, который имеет атрибуты int bar и boolean baz:

class Foo { 
    int bar; 
    boolean baz; 
} 

Я хочу, чтобы получить новый список, который содержит только те объекты, которые соответствуют заданным критериям (например bar > 1) из это ArrayList. В других языках, таких как Perl, я бы просто использовать grep(), чтобы получить все эти объекты:

@where_bar_greater_one = grep { $_->{bar} > 1 } @list; 

Но это, кажется, не так просто с Java. Сейчас я эмулировать такое поведение со статическим методом, который перебирает все элементы с анонимным внутренним классом:

interface ListPredicate<T> { 
    boolean match(T item); 
} 

class ListUtil { 
    public static <T> List<T> grep(List<T> source, ListPredicate<T> predicate) { 
     ArrayList<T> results = new ArrayList<T>(); 
     for(T item : source) { 
      if(predicate.match(item)) results.add(item); 
     } 
     return results; 
    } 
} 

ArrayList<Foo> found = new ArrayList<Foo>(ListUtil.grep(list, new ListPredicate<Foo>() { 
    @Override public boolean match(Foo item) { 
     return item.bar > 1 ? true : false; 
    } 
})); 

По сравнению с небольшими кусок Perl этот код выглядит довольно раздутым, и мне интересно, не пропустил ли я что-то. Таким образом, это оставляет мне два вопроса:

  1. Есть ли более короткий (и, возможно, более чистый) способ сделать это без использования каких-либо внешних библиотек?
  2. Рекомендуются ли библиотеки с открытым исходным кодом, которые предоставляют методы для таких общих функций более высокого порядка (например, grep, foldLeft, reduceLeft, map и т. Д.)?
+2

Для 2. взгляните на Google Guava. – Thilo

+0

Посмотрите на Apache CollectionUtils http://commons.apache.org/collections/ – Chan

+0

Не то, чтобы это много помогало, но Java 8 будет иметь много этих лакомств как часть его лямбда. – yshavit

ответ

1

Вы можете использовать JFilter для запроса коллекций java.

Другой вариант заключается в использовании Commons Collections с предикатами (как описано here)

Удачи!

+0

Проблема с коллекциями Commons заключается в том, что они не поддерживают дженерики, что очень важно для коллекций. – Thilo

+0

@ Тило, в этом случае JFilter будет делать магию. – aviad

0

или вы можете использовать grep4j для java greps. (также работает с удаленными файлами)

Смежные вопросы