Я пишу небольшое приложение, которое должно выполнять общую задачу во множестве разных списков: Фильтрация объектов по заданным критериям.Есть ли способ фильтрации в 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 этот код выглядит довольно раздутым, и мне интересно, не пропустил ли я что-то. Таким образом, это оставляет мне два вопроса:
- Есть ли более короткий (и, возможно, более чистый) способ сделать это без использования каких-либо внешних библиотек?
- Рекомендуются ли библиотеки с открытым исходным кодом, которые предоставляют методы для таких общих функций более высокого порядка (например,
grep
,foldLeft
,reduceLeft
,map
и т. Д.)?
Для 2. взгляните на Google Guava. – Thilo
Посмотрите на Apache CollectionUtils http://commons.apache.org/collections/ – Chan
Не то, чтобы это много помогало, но Java 8 будет иметь много этих лакомств как часть его лямбда. – yshavit