从Java Pattern Matcher: create new or reset?我了解到,如果我在单线程上下文中,最好重用Matcher
。
因此,假设我有一个使用File.list(basePath)
的路径流,并且我想根据与正则表达式匹配的文件名来过滤它们。看来我应该对流中的每个路径文件名使用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创建者是否没有想到此用例?
答案 0 :(得分:0)
我对一些经常执行的文件名匹配做了一些计时,调用Matcher.reset(String)
可以将匹配速度提高约20%/减少了所使用的内存。
幸运的是,Matcher.reset()
返回this
使其易于在流过滤器中进行引用,尽管在使用前设置空白匹配器似乎有些浪费,但值得将其更改为:
stream.filter(s -> pattern.matcher(s).matches())
...有多余的行来初始化Matcher:
Matcher matcher = pattern.matcher("");
stream.filter(s -> matcher.reset(s).matches())