subList视图基于元素的值

时间:2012-01-26 13:52:30

标签: java collections

我知道Collection框架允许创建“视图”,即Collection对象的轻量级“包装器”。
我特别感兴趣的是,给定一个List,只返回一个符合某些条件的元素子集的视图 基本上,我想要模仿的是subList()方法的功能,只是不基于开始和结束索引,而是基于元素的某些参数。

我想到的第一种方法只是创建另一个List,浏览第一个List并检查每个元素......
虽然这实际上不会复制任何MyObject而只复制它们的引用,但我仍然会创建一个新的List对象及其开销。不是吗? 有没有轻量级的方法来做我需要的东西?

N.B。我原来的List是一个非常大的收藏......

谢谢大家

2 个答案:

答案 0 :(得分:4)

您可以使用Guava集合在Java中轻松完成此操作(Collections2具有filter方法http://docs.guava-libraries.googlecode.com/git-history/v11.0.1/javadoc/index.html)。

您也可以使用findAll方法在groovy中执行此操作,例如

myList.findAll { it.contains("aValue") }

任何这些方法都会在幕后创建一个新的集合。所以他们只是为你做的工作迭代元素并检查它们。创建新列表的开销很小(它只是实例化一个新对象)。

答案 1 :(得分:2)

I would anyways create a new List object, with its overhead

我不明白你在这里关心的是什么。查看List类中的source of ArrayList class偶数subList(int fromIndex, int toIndex)方法会创建一个新的内部类(从List扩展)。这基本上就是你将在你的方法中做的事情,即创建一个新的List实例并将匹配元素的引用复制到其中。该自定义方法将或多或少具有与subList方法相同的性能。