2014-10-07 72 views
1

这里可能缺少一些基本的东西,但是从列表中选择符合某些条件的对象的最佳方法是什么? 说我们有:从列表中选择特定的对象用Java

class MyObject { 
    int id; 
    String type; 

    // getters..setters 
} 

我使用它:

List<MyObject> myObjects = new ArrayList<MyObject>(); 
    myObjects = getListOfObjects(); 

现在让我们说,在myObjects有10个项目,其中3个有type=="bla"。此刻,我只是循环所有对象,并在循环内决定是否需要它,但有没有更好的方法?

我记得,在C#中我曾经有过类似

myObjects.Where(x => x.type.equals("bla")); 

PS,我指定的Java 7所以没有拉姆达我呢。

+0

然后你已经做对了。 – 2014-10-07 10:59:33

+1

如果您试图避免循环遍历列表并打算总是按类型检索对象组,请考虑一个'Map >' – 2014-10-07 11:05:01

+0

另一种替代方案可以是番石榴Multimap。在你的情况下,“bla”将是关键。 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html – 2014-10-07 11:12:36

回答

0

我不认为你可以做到这一点,而无需创建某种索引。所以例如有Map<String, Map<String, Set<MyObject>>>你可以拨打电话index.get("type").get("bla")。但是你必须先构建这个结构。如果:a)属性没有变化b)您有很多对象。对于10个对象来说,这里的性能并不重要,我只是简单地做你现在正在做的事情,并将其隐藏在一些非常方便的方法中。

0

您可以使用LambdaJ library及其Lambda.exists方法与一些自定义Hamcrest匹配。然后,你可以让你的主代码如下所示:

if (exists(myObjects, typeIs("bla"))) { /* ... */ } 

...只要你自己创建自定义的匹配方法typeIs。但是如果我只有一个地方只有一个地方只有10件物品,我就不会这样下去。

这也取决于你的数据:如果你的清单是排序的,你可以do a binary search就可以了。尽管如此,如果列表中有成千上万的项目,这会更有用。

最后,你可以只使用Collection.containsmyObjects.contains(blaElement),但要求blaElement有这样一个equals方法,返回“真”的类型相匹配时。