基于其他列表属性集合从List <X>中提取对象

Pre*_*raj 5 java collections guava

我上课了 -

public class Data implements Identifiable{
    private Integer id;

    public Integer getId(){
        return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有两个收藏 -

List<Data> data1 = // few hundred Objects

Set<Integer> dataIds = // few object ids
Run Code Online (Sandbox Code Playgroud)

我想提取List<Data>data1具有IDS在dataIds

我的方法应该怎样?如果在性能/效率方面具有可比性,我可以使用番石榴的功能方法.

Col*_*inD 3

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

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

我看到你的Data类实现了一个Identifiable接口。鉴于此,您可以创建一个Function<Identifiable, Integer>获取 ID...Identifiables.getIdFunction()或其他东西。这很好,因为它可能在其他各个地方都很有用(我在这里的博客文章中讨论了这种方法)。有了这些,使用 Guava 执行此操作也将相当简单:

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

这在功能上基本上等同于第一个示例,但似乎更难理解。由于这样做没有任何明显的好处(与您只想使用实时视图的情况不同),我的建议是选择第一个。