不使用迭代器过滤列表

时间:2011-08-05 05:15:40

标签: java collections guava

我需要过滤大小为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);

任何人都可以建议我如何在没有迭代的情况下更快地获得子列表,或者如果使用迭代器,我将得到相对更快的结果。

4 个答案:

答案 0 :(得分:2)

如果您在子列表中调用size(),请考虑会发生什么。那个来检查每个元素,因为每个元素都可能改变结果。

如果你有一个非常专业的使用你的列表的方式,这意味着你不要触及其中的每个元素,不要使用随机访问等,也许你不希望{ {1}}界面。如果你能告诉我们你正在做什么的更多信息,那真的会有所帮助。

答案 1 :(得分:0)

List是有序的对象集合。所以你必须迭代它才能过滤。

答案 2 :(得分:0)

我丰富了我的评论: 我认为迭代器在过滤过程中是不可避免的,因为每个元素都必须被检查。

关于Collections2.filter,它与简单过滤器不同:返回的Collection仍然是“Predicated”。这意味着如果向IllegalArgumentException添加了未满足的元素,则会抛出Collection

答案 3 :(得分:0)

如果性能确实是您的关注点,那么谓词很可能很慢。你可以做的是Lists.partition你的列表,并行过滤(你必须写这个),然后连接结果。

可能有更好的方法来解决您的问题,但我们需要有关谓词和列表中数据的更多信息。