我正在尝试实现一个相当简单的方法,我想在其中过滤列表。这是一个 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;
}
它有效,但感觉非常浪费,因为我正在创建第二个列表并从一个列表复制到另一个列表。
我玩过的另一个选择是使用 guava-libraries (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,但是我觉得它让我的代码更复杂了。
还有其他我没有考虑的更简单的实现吗?
在整个方案中,我选择哪种实现可能并不重要。我只是好奇其他开发人员将如何解决这个问题以及他们会选择什么选项。
谢谢。