首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java集合筛选

Java集合筛选
EN

Stack Overflow用户
提问于 2009-11-24 20:14:48
回答 11查看 5.8K关注 0票数 3

我有这样的东西:

代码语言:javascript
复制
public class Foo {
  public String id;
}

代码语言:javascript
复制
Vector<Foo> foos;

我需要通过id从集合中获取一个对象。

在C#中,我会这样做:foos.Where(o => o.id = 7)

在Java中实现这一点的最佳方法是什么?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-11-24 23:18:10

您可能希望将数据存储在Map而不是列表中。例如,TreeMap将保持所有内容的排序顺序。

票数 5
EN

Stack Overflow用户

发布于 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>)

票数 11
EN

Stack Overflow用户

发布于 2009-11-24 22:57:26

对于Google Collections,这将是:

代码语言:javascript
复制
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 (或适合于该问题的其他类型)。

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

https://stackoverflow.com/questions/1789701

复制
相关文章

相似问题

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