首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找集合中具有给定属性的所有对象

查找集合中具有给定属性的所有对象
EN

Stack Overflow用户
提问于 2009-02-25 19:15:27
回答 20查看 141.6K关注 0票数 92

我有一些复杂的对象,比如猫,它有很多特性,比如年龄,最喜欢的猫粮,等等。

一堆猫被存储在Java集合中,我需要找到所有3岁的猫,或者那些最喜欢吃猫粮的猫。当然,我可以编写一个自定义方法来查找那些具有特定属性的猫,但是对于许多属性,这会变得非常麻烦;是否有一些通用的方法来做到这一点呢?

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2009-02-25 19:19:17

您可以编写一个方法,该方法接受定义check(Cat)方法的接口实例,该方法可以通过任意属性检查来实现。

更好的是,让它成为通用的:

代码语言:javascript
复制
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;
}

当然,就像其他人说的,这就是关系数据库的目的.

票数 46
EN

Stack Overflow用户

发布于 2009-02-25 23:45:13

试试公用集合API:

代码语言:javascript
复制
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接口的实现。

票数 62
EN

Stack Overflow用户

发布于 2013-05-24 04:18:53

使用Java 8 lambda表达式,您可以执行以下操作

代码语言:javascript
复制
cats.stream()
    .filter( c -> c.getAge() == 3 && c.getFavoriteFood() == WHISKAS )
    .collect(Collectors.toList());

在概念上与番石榴谓词方法相同,但使用lambda看起来要干净得多。

对于OP来说,可能不是一个有效的答案,但是对于有类似需求的人来说,值得注意。:)

票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/587404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档