如何从列表中筛选元素

McG*_*one 3 java guava

我正在尝试实现一个相当简单的方法,我想过滤一个列表.这是一个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;
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是我创建第二个列表并从一个列表到另一个列表进行大量复制时感觉非常浪费.

我玩弄的另一个选择是使用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())    
    );

}
Run Code Online (Sandbox Code Playgroud)

filter的实现在迭代时删除.asp文件,而不是提前删除.所以这段代码的好处是没有制作第二个List,但我觉得它使我的代码更复杂.

还有其他更简单的实现我不考虑吗?

在整个方案中,我选择的实现可能并不重要.我只是好奇其他开发者如何解决这个问题以及他们会选择哪种选择.

谢谢.

Col*_*inD 5

您可以使用以下toString()函数组成正则表达式匹配谓词:

public Iterable<File> getSurveyFiles() {
  return Iterables.filter(files, Predicates.compose(
      Predicates.not(Predicates.containsPattern("\\.asp$")),
      Functions.toStringFunction()));
}
Run Code Online (Sandbox Code Playgroud)