java过滤对象列表的最佳方法
我有一个对象列表说Sales。 我只想要其Product与另一个列表中的Product匹配的Sales对象,比如saleProductList。
除了循环之外,还有更好的方法吗?
如果您已经在使用Google的Guava库,那么它有一个Collections2.filter()方法,该方法只返回与给定谓词匹配的集合中的项目。
但是,这是否能回答您的问题取决于您避免循环的动机。 由于Java集合没有内置此function,因此唯一的方法是在某个级别迭代所有元素。 Guava在内部执行此操作,但它仍在执行您手动执行的相同循环,只需使用更好的API。
您可以使用Apache commons库中的Collections
方法。 然而,这些方法只是为你做循环。 在尝试做你需要的时候,你无法真正避免它。
有类似function的替代方案使您的代码简单易懂,但内部可能必须遍历列表。 但他们LAZILY执行过滤,如果有可能客户端可能不会总是使用它,那就很好。
检查filter(…)方法是否适合您: Iterables.filter(Iterable,Predicate)
我建议2个解决方案
-
使用jakarta集合框架中的谓词。
可能有不同的谓词。 你可以组合它们并创建非常复杂的filter。 -
阅读我的文章: http : //java.dzone.com/articles/useful-abuse ,搜索子标题“过滤模式的实现”。
我希望这能帮到您。
在某种程度上,循环将不可避免地涉及到。
如果两个数据结构都是列表,则成本将与2个列表长度的PRODUCT成比例。 如果列表很大,那可能会非常昂贵。
为了避免这种情况,一个或两个列表需要由一些数据结构表示,该结构比简单列表提供更快的查找。
使用Google的馆藏图片 :
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));
(我将类型参数化作为练习留给读者。)