2011-04-21 58 views
5

我有一类 -提取物

public class Data implements Identifiable{ 
    private Integer id; 

    public Integer getId(){ 
     return id; 
    } 
} 

现在我已经2 collections-

List<Data> data1 = // few hundred Objects 

Set<Integer> dataIds = // few object ids 

我想提取List<Data>data1其中有ID在dataIds

我应该怎么做?如果在性能/效率上可比,那么我的班级路线中就有番石榴,所以可以使用番石榴的功能性方法。

+2

如果数据ID的对应于上述列表对象的ID的,那么为什么一个是整数。当对方是龙? 另外,使用什么样的集合类型?例如:data1是ArrayList 还是LinkedList? – dominicbri7 2011-04-21 15:45:59

+0

是一个错误..更正 – Premraj 2011-04-21 15:48:40

回答

3

除非您想要做的只是遍历结果一次,或者您需要可重用的实时过滤视图,否则可能需要包含匹配的非视图列表。创建ListSet来存储结果,然后遍历数据列表并添加匹配,这是一个非常好的方法,并且易于理解!

List<Data> result = Lists.newArrayList(); 
for (Data data : data1) { 
    if (dataIds.contains(data.getId())) 
    result.add(data); 
} 

我看到你的Data类实现一个Identifiable接口。鉴于此,您可以创建一个Function<Identifiable, Integer>,获取ID ... Identifiables.getIdFunction()或其他内容。这很好,因为它可能在其他地方很有用(我在博客文章here中讨论了这种方法)。随着到位,与番石榴做这将是相当简单的,以及:

Predicate<Identifiable> predicate = Predicates.compose(
    Predicates.in(dataIds), Identifiables.getIdFunction()); 
List<Data> filtered = Lists.newArrayList(Iterables.filter(data1, predicate)); 

这基本上是功能上等同于第一个例子,但好像它会是很难理解的。由于这样做没有明显的好处(与您只想使用实时视图的情况不同),所以我的建议是先按照第一步进行。

3

如何

Collections2.filter(
    data1, 
    new Predicate<Data>() { 
     public boolean apply(Data d) { 
     return dataIds.contains(d.getId()); 
     } 
    } 
) 

附: remember not to overcomplicate事情,除非真正有必要。

+0

感谢您的链接..得到了重点:) – Premraj 2011-04-21 16:04:28

0

随着LambdaJ你可以写:

List<Data> result = extract(data1, on(Data.class).getId());