使用 Google 番石榴过滤 JavaBean 列表

2022-09-01 19:45:27

在Java程序中,我有一个bean列表,我想根据特定的属性进行过滤。

例如,假设我有一个Person列表,一个JavaBean,其中Person有许多属性,其中包括“name”。

我还有一个名字列表。

现在我想找到名字在名字列表中的所有人。

使用谷歌番石榴执行此过滤器的最佳方法是什么?

到目前为止,我一直在考虑将番石榴与Apache豆官能结合,但这似乎并不优雅。

我还在这里找到了一个反射扩展库:http://code.google.com/p/guava-reflection/,但我不确定如何使用它(文档很少)。

有什么想法吗?

p.s. 你能看出我真的很想念Python列表理解吗?


答案 1

以老式的方式做,没有番石榴。(以番石榴开发者的身份发言。

List<Person> filtered = Lists.newArrayList();
for(Person p : allPersons) {
   if(acceptedNames.contains(p.getName())) {
       filtered.add(p);
   }
}

你可以用Guava做到这一点,但Java不是Python,试图把它变成Python只会使尴尬和不可读的代码永久化。番石榴的功能实用程序应该谨慎使用,并且只有当它们为代码行或性能提供具体且可衡量的好处时。


答案 2
Iterable<Person> filtered = Iterables.filter(allPersons, new Predicate<Person>() {
    @Override
    public boolean apply(Person p) {
        return acceptedNames.contains(p.getName());
    }
});

如果你的名字列表很大,你最好把它转换成一个集合(最好是HashSet),并在这个集合上调用包含,而不是列表,因为 contains是O(1)对于哈希集,O(n)对于列表。