我试图实现一个相当简单的方法,在该方法中我想筛选一个列表。这是一个File对象的列表,应该只有一个以.asp结尾的文件 - 我希望那个从列表中排除。请记住,我实际上并不想将这个文件从列表中删除,我只是希望能够忽略该列表的特定迭代。如何从列表中筛选元素
我原来的(暴力)的实现是这样的:
public List<File> getSurveyFiles() throws Exception {
List<File> surveyFiles = new ArrayList<File>(files.size() - 1);
for (File f : files) {
if (!f.getName().endsWith(".asp")) {
surveyFiles.add(f);
}
}
return surveyFiles;
}
它的工作原理,但它在我创建第二个列表,并做了很多复制从一个列表这样的事实感到非常浪费另一个。
我和玩弄另一种选择是使用番石榴库(http://code.google.com/p/guava-libraries/),并利用它们的过滤功能,如:
public class SurveyFileControllerPredicate implements Predicate<File> {
@Override
public boolean apply(File file) {
return file.getName().endsWith(".asp");
}
}
...
public Iterable<File> getSurveyFiles() throws Exception {
return Iterables.filter(
files,
Predicates.not(new SurveyFileControllerPredicate())
);
}
过滤器的实现会在迭代时删除.asp文件,而不是提前,因此此代码具有不创建第二个List的好处,但我觉得它使我的代码更加复杂。
我还没有考虑其他更简单的实现吗?
在事物的整个方案中,我选择的实现可能并不重要。我只是好奇其他开发者如何解决这个问题,他们会选择什么样的选择。
谢谢。
你迭代的情况下,其中[的FilenameFilter(http://docs.oracle.com/javase/6/docs/api/java/io/FilenameFilter.html)是合适的,虽然这些文件? –
当您填充原始列表本身时,是否可以添加过滤器?我的意思是,原始列表人口是通过您的代码完成的,还是您收到预先填充的代码? –