[英]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.