繁体   English   中英

创建可重用的 Java 匹配器

[英]create reusable Java Matcher

我从Java Pattern Matcher 中了解到:创建新的还是重置? 如果我在单线程上下文中,最好重用Matcher

所以假设我有一个使用File.list(basePath)的路径流,我想根据将它们的文件名与正则表达式匹配来过滤它们。 看来我应该matcher.reset(filename)中的每个路径文件名使用matcher.reset(filename) 精彩的。

但是如何初始化Matcher以便我可以重用它,而无需先创建它并匹配某些东西? 因为我不知道第一个“东西”是什么——我什至不知道是否会有“东西”(例如某个目录中的文件)。

所以我这样做是为了开始吗?

final Matcher filenamePatternMatcher=filenamePattern.matcher("");

这看起来既麻烦又浪费。 但是,如果我将filenamePatternMatcher设置为null ,我将不得不对处理各个文件进行不必要的检查,例如:

if((filenamePatternMatcher!=null
    ? filenamePatternMatcher.reset(filename)
    : filenamePattern.matcher(filename)).matches) {…}

此外,我什至不能在Stream<Path>这样做,因为匹配器必须是有效的。

那么创建一个稍后将使用Matcher.reset()匹配字符串的匹配器的优雅方法是什么? Java API 创建者没有想到这个用例吗?

我对我经常做的一些文件名匹配做了一些计时,调用Matcher.reset(String)将匹配速度提高了约 20%/减少了内存使用。

幸运的Matcher.reset()返回this使它容易流过滤器内引用,虽然看起来有点浪费设置使用前空白匹配,这是值得努力的变化:

stream.filter(s -> pattern.matcher(s).matches())

...有额外的行来初始化匹配器:

Matcher matcher = pattern.matcher("");
stream.filter(s -> matcher.reset(s).matches())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM