Я понимаю из Java Pattern Matcher: создать новый или сбросить? , что лучше повторно использовать 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 не думали об этом сценарии использования?