可能是我在这里缺少的一些基本内容,但是从列表中选择符合某些条件的对象的最佳方法是什么? 说我们有:
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,所以还没有lambda。
答案 0 :(得分:0)
我不认为你可以在不创建某种索引的情况下做到这一点。所以例如Map<String, Map<String, Set<MyObject>>>
您可以拨打index.get("type").get("bla")
。但你必须首先构建这个结构。如果a)没有对属性进行更改 AND b)你有很多对象,这将非常有用。对于10个对象,这里的表现无关紧要,我只是做你现在正在做的事情并将其隐藏在一些非常方便的方法中。
答案 1 :(得分:0)
您可以将LambdaJ library及其Lambda.exists方法与一些自定义Hamcrest匹配器一起使用。然后你可以使你的主要代码看起来像这样:
if (exists(myObjects, typeIs("bla"))) { /* ... */ }
...前提是您自己创建自定义匹配器方法typeIs
。但如果我只有一个地方只有10个项目,我就不会这样下去。
它还取决于您的数据:如果您的列表已排序,您可以do a binary search。如果您在列表中有数千个项目,那么这将更有用。
最后,您可以使用Collection.contains:myObjects.contains(blaElement)
,但这要求blaElement有一个equals
方法返回&#34; true&#34;当类型匹配时。