过滤Java集合的最佳方法是什么?
我想过滤java.util.Collection基于谓词的。
高分回答:
Java 8(2014)在一行代码中使用流和lambda解决了此问题:
List<Person> beerDrinkers = persons.stream()
.filter(p -> p.getAge() > 16).collect(Collectors.toList());
这是一个教程。
用于Collection#removeIf在适当位置修改集合。(注意:在这种情况下,谓词将删除满足该谓词的对象):
persons.removeIf(p -> p.getAge() <= 16);
lambdaj允许过滤集合而无需编写循环或内部类:
List<Person> beerDrinkers = select(persons, having(on(Person.class).getAge(),
greaterThan(16)));
您能想象一些更具可读性的东西吗?
高分回答:
假设您使用的是Java 1.5,并且无法添加Google Collections,那么我将执行与Google员工非常相似的操作。这与乔恩的评论略有不同。
首先将此接口添加到您的代码库中。
public interface IPredicate<T> { boolean apply(T type); }
当某个谓词为某种类型的真时,其实现者可以回答。例如,如果T是User和AuthorizedUserPredicate实施IPredicate,则AuthorizedUserPredicate#apply返回传入的User内容是否被授权。
然后在某些实用程序类中,您可以说
public static <T> Collection<T> filter(Collection<T> target, IPredicate<T> predicate) {
Collection<T> result = new ArrayList<T>();
for (T element: target) {
if (predicate.apply(element)) {
result.add(element);
}
}
return result;
}
因此,假设您已使用上述方法,则可能是
Predicate<User> isAuthorized = new Predicate<User>() {
public boolean apply(User user) {
// binds a boolean method in User to a reference
return user.isAuthorized();
}
};
// allUsers is a Collection<User>
Collection<User> authorizedUsers = filter(allUsers, isAuthorized);
文章翻译自kgs4h5t57thfb6iyuz6dqtun5y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/1…
作者建议:第一条回答,是lambada的开发人员回答的,我推荐用流处理方式来实现