java元素过滤_java – 如何从列表中过滤元素

我正在尝试实现一个相当简单的方法,我想过滤一个列表.这是一个File对象列表,应该只有一个以.asp结尾的文件 – 我希望从列表中排除一个.请记住,我实际上并不想从列表中删除此文件,我只是希望能够忽略该列表的特定迭代.

我的原始(蛮力)实现看起来像这样:

public List getSurveyFiles() throws Exception {

List surveyFiles = new ArrayList(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 {

@Override

public boolean apply(File file) {

return file.getName().endsWith(".asp");

}

}

...

public Iterable getSurveyFiles() throws Exception {

return Iterables.filter(

files,

Predicates.not(new SurveyFileControllerPredicate())

);

}

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

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

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

谢谢.

解决方法:

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

public Iterable getSurveyFiles() {

return Iterables.filter(files, Predicates.compose(

Predicates.not(Predicates.containsPattern("\\.asp$")),

Functions.toStringFunction()));

}

标签:java,guava

来源: https://codeday.me/bug/20190729/1570601.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值