我知道Collection框架允许创建“视图”,即Collection对象的轻量级“包装器”。
我特别感兴趣的是,给定一个List,只返回一个符合某些条件的元素子集的视图
基本上,我想要模仿的是subList()方法的功能,只是不基于开始和结束索引,而是基于元素的某些参数。
我想到的第一种方法只是创建另一个List,浏览第一个List并检查每个元素......
虽然这实际上不会复制任何MyObject而只复制它们的引用,但我仍然会创建一个新的List对象及其开销。不是吗?
有没有轻量级的方法来做我需要的东西?
N.B。我原来的List是一个非常大的收藏......
谢谢大家
答案 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方法相同的性能。