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);