Matcher の find() と group() (1)

java.util.regex.Matcher は、マッチをさせてから、一致部分を抽出というステップが
煩わしいと思っていた。

例えばファイル名の一部が時刻文字列(yyyyMMddHHmmss)になっており、時刻まで求めるのに、
java.util.regex.Pattern 正規表現でマッチー>Matcher で find() を実行させてから、
group() で抽出ー>LocalDateTime へ。
なんて手間で、Matcher 変数を持たなければならないカッコ悪さがある。
工夫しようと考えても。。

BiFunction<File, Pattern, LocalDateTime> fileNameToDateTime = (file, p)->{
    Matcher m = p.matcher(file.getName());
    m.find();
    return LocalDateTime.parse(m.group(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
};
Pattern ptn = Pattern.compile("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(0[0-9]|1[0-9]|2[0-3])(0[0-9]|[0-5][0-9])(0[0-9]|[0-5][0-9])");
List<File> list = 
Arrays.stream(new File(path).listFiles(f->ptn.matcher(f.getName()).matches()))
.sorted((a, b)->fileNameToDateTime.apply(b, ptn2).compareTo(fileNameToDateTime.apply(a, ptn)))
.collect(Collectors.toLis());

Optional を使う

LocalDateTime d1 = Optional.ofNullable(ptn.matcher(string))
.map(m->m.find() ? LocalDateTime.parse(m.group(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) : null)
.orElse(null);