java过滤对象列表的最佳方法

时间:2010-11-18 14:12:06

标签: java

我有一个对象列表说Sales。我只想要其Product与其他列表中的Product匹配的Sales对象,比如saleProductList。

除了循环之外,还有更好的方法吗?

6 个答案:

答案 0 :(得分:13)

如果您已经在使用Google的Guava库,那么它有一个Collections2.filter()方法,该方法只返回与给定Predicate匹配的集合中的项目。

但是,这是否能解答您的问题取决于您避免循环的动机。由于Java集合没有内置此功能,因此方法是在某个级别迭代所有元素。 Guava在内部执行此操作,但它仍在执行与您手动执行的相同循环,只需使用更好的API。

答案 1 :(得分:1)

您可以使用Apache commons库中的Collections方法。但是这些方法只是为你做循环。在尝试做你需要的时候,你无法真正避免它。

答案 2 :(得分:1)

有类似功能的替代方案可以使您的代码简单易懂,但内部可能需要遍历列表。但是,如果有可能客户端可能并不总是使用它,那么他们可以执行过滤,这很好。

检查过滤器(...)方法是否适合您:Iterables.filter(Iterable, Predicate)

答案 3 :(得分:1)

我建议2个解决方案

  1. 使用jakarta collection framework中的谓词 可能有不同的谓词。你可以组合它们并创建非常复杂的过滤器。

  2. 阅读我的文章:http://java.dzone.com/articles/useful-abuse, 搜索子标题“过滤模式的实现”。

  3. 我希望这会对你有所帮助。

答案 4 :(得分:0)

在某种程度上,循环将不可避免地涉及。

如果两个数据结构都是列表,那么成本将与2个列表长度的PRODUCT成比例。如果列表很大,这可能会非常昂贵。

为了避免这种情况,一个或两个列表需要由一些数据结构表示,这种数据结构比简单列表提供更快的查找。

答案 5 :(得分:0)

使用Google的collections libray

List result1 = Lists.newArrayList(Collections2.filter(originalList,filterPredicate));
List result2 = Lists.newLinkedList(Collections2.filter(originalList,filterPredicate));

虽然这些确实为您提供了正确的列表,但它们会立即产生存储开销和迭代时间开销。如果你宁愿推迟(“懒惰”评估),你可以使用Iterable或Iterator进行串行访问:

Iterable result3 = Iterables.filter(originalList,filterPredicate));  // Pangea's solution
Iterator result4 = Iterators.filter(originalList.iterator(),filterPredicate));

(我将类型参数化作为练习留给读者。)