我需要过滤大小为1000或更大的List并从中获取一个子列表。 我不想使用迭代器。
1)目前我正在迭代List并使用Java进行比较。这是一项耗时的任务。我需要提高代码的性能。
2)我也尝试使用Google Collections(Guava),但我认为它也会在后台迭代。
Predicate<String> validList = new Predicate<String>(){
public boolean apply(String aid){
return aid.contains("1_15_12");
}
};
Collection<String> finalList =com.google.common.collect.Collections2.filter(Collection,validList);
任何人都可以建议我如何在没有迭代的情况下更快地获得子列表,或者如果使用迭代器,我将得到相对更快的结果。
答案 0 :(得分:2)
如果您在子列表中调用size()
,请考虑会发生什么。那个有来检查每个元素,因为每个元素都可能改变结果。
如果你有一个非常专业的使用你的列表的方式,这意味着你不要触及其中的每个元素,不要使用随机访问等,也许你不希望{ {1}}界面。如果你能告诉我们你正在做什么的更多信息,那真的会有所帮助。
答案 1 :(得分:0)
List是有序的对象集合。所以你必须迭代它才能过滤。
答案 2 :(得分:0)
我丰富了我的评论: 我认为迭代器在过滤过程中是不可避免的,因为每个元素都必须被检查。
关于Collections2.filter
,它与简单过滤器不同:返回的Collection
仍然是“Predicated”。这意味着如果向IllegalArgumentException
添加了未满足的元素,则会抛出Collection
。
答案 3 :(得分:0)
如果性能确实是您的关注点,那么谓词很可能很慢。你可以做的是Lists.partition你的列表,并行过滤(你必须写这个),然后连接结果。
可能有更好的方法来解决您的问题,但我们需要有关谓词和列表中数据的更多信息。