«Лучший» способ слишком широк. Это «кратчайший»? «Самый быстрый»? "Удобочитаемый"? Фильтр на месте или в другую коллекцию?
Простейший (но не самый читаемый) способ заключается в его повторении и использовании метода Iterator.remove ():
Iterator<Foo> it = col.iterator();
while( it.hasNext() ) {
Foo foo = it.next();
if( !condition(foo) ) it.remove();
}
Теперь, чтобы сделать это более читаемо, вы можете обернуть его в утилиту. Затем придумайте интерфейс IPredicate, создайте анонимную реализацию этого интерфейса и сделайте что-то вроде:
CollectionUtils.filterInPlace(col,
new IPredicate<Foo>(){
public boolean keepIt(Foo foo) {
return foo.isBar();
}
});
, где filterInPlace () перебирает коллекцию и вызывает Predicate.keepIt (), чтобы узнать, сохраняется ли экземпляр в сборнике.
Я действительно не вижу оправдания для привлечения сторонней библиотеки только для этой задачи.