我有一些复杂的对象,比如猫,它有很多特性,比如年龄,最喜欢的猫粮,等等。
一堆猫被存储在Java集合中,我需要找到所有3岁的猫,或者那些最喜欢吃猫粮的猫。当然,我可以编写一个自定义方法来查找那些具有特定属性的猫,但是对于许多属性,这会变得非常麻烦;是否有一些通用的方法来做到这一点呢?
发布于 2009-02-25 19:19:17
您可以编写一个方法,该方法接受定义check(Cat)方法的接口实例,该方法可以通过任意属性检查来实现。
更好的是,让它成为通用的:
public interface Checker<T> {
public boolean check(T obj);
}
public class CatChecker implements Checker<Cat> {
public boolean check(Cat cat) {
return (cat.age == 3); // or whatever, implement your comparison here
}
}
// put this in some class
public static <T> Collection<T> findAll(Collection<T> coll, Checker<T> chk) {
LinkedList<T> l = new LinkedList<T>();
for (T obj : coll) {
if (chk.check(obj))
l.add(obj);
}
return l;
}当然,就像其他人说的,这就是关系数据库的目的.
发布于 2009-02-25 23:45:13
试试公用集合API:
List<Cat> bigList = ....; // master list
Collection<Cat> smallList = CollectionUtils.select(bigList, new Predicate() {
public boolean evaluate(Object o) {
Cat c = (Cat)o;
return c.getFavoriteFood().equals("Wiskas")
&& c.getWhateverElse().equals(Something);
}
});当然,不必每次都使用匿名类,您可以为常用的搜索创建Predicate接口的实现。
发布于 2013-05-24 04:18:53
使用Java 8 lambda表达式,您可以执行以下操作
cats.stream()
.filter( c -> c.getAge() == 3 && c.getFavoriteFood() == WHISKAS )
.collect(Collectors.toList());在概念上与番石榴谓词方法相同,但使用lambda看起来要干净得多。
对于OP来说,可能不是一个有效的答案,但是对于有类似需求的人来说,值得注意。:)
https://stackoverflow.com/questions/587404
复制相似问题