我有这样的东西:
public class Foo {
public String id;
}和
Vector<Foo> foos;我需要通过id从集合中获取一个对象。
在C#中,我会这样做:foos.Where(o => o.id = 7)
在Java中实现这一点的最佳方法是什么?
发布于 2009-11-24 23:18:10
您可能希望将数据存储在Map而不是列表中。例如,TreeMap将保持所有内容的排序顺序。
发布于 2009-11-24 20:19:02
首先,我建议使用ArrayList<Foo>而不是Vector<Foo> - ArrayList几乎总是比Vector更可取。
使用Google Collections应用编程接口,特别是Iterables.filter。由于缺少lambda表达式,目前它相当笨拙--您要么需要预先设置一个谓词,要么使用一个匿名内部类。另外,Java没有扩展方法,所以您将调用Iterables.filter(collection, predicate)而不是collection.filter(predicate)。在Java7中,这两种方法都会得到一定程度的简化。
请注意,使用filter将找到一个Iterable<Foo> -如果您只需要第一个匹配,请使用Iterables.find,这相当于LINQ中的Enumerable.First<T>(Func<T, bool>)。
发布于 2009-11-24 22:57:26
对于Google Collections,这将是:
Lists.newArrayList(Iterables.filter(foos, new Predicate<Foo>() {
public boolean apply(Foo input) {
return input != null && "7".equals(input.id);
}
}));Iterables.filter (以及Collections2.filter,它也做同样的事情)为您提供了过滤集合的实时视图,就像seh的概念一样,但代码更少。为了再次创建列表,我将其传递给Google Collection的list实用程序类的newArrayList方法。
就像其他人一样,我强烈建议不要使用Vector作为声明。取而代之的是,尽量使用最泛型的类型,例如List甚至Collection。此外,除非您需要矢量的同步特性,否则请使用ArrayList (或适合于该问题的其他类型)。
https://stackoverflow.com/questions/1789701
复制相似问题