我每分钟在一个线程中验证目录中的许多文件。 目前我正在使用下面的功能,工作正常。 我的问题是我是否可以重写此方法以更快地运行(java8?),并希望缩短。
public boolean validateFile(String fileName) {
fileName = fileName.substring(0, fileName.lastIndexOf('.'));
String[] values = fileName.split("_");
if (values.length == 4) {
if(!values[1].matches("0*")) {
if(!fileName.contains(" ")) {
if(values[3].equals("PASS") || values[3].equals("FAIL")) {
return true;
}
}
}
}
return false;
}
验证规则:
答案 0 :(得分:5)
像这样 - 只是将分支转换为java-8。可能更具可读性,但速度不快。
return Optional.ofNullable("test") // your fileName
.filter(x -> !x.contains(" "))
.map(x -> x.substring(0, x.lastIndexOf(".")))
.map(x -> x.split("_"))
.filter(arr -> arr.length == 4)
.filter(arr -> !arr[1].matches("0*"))
.filter(arr -> arr[3].equals("PASS") || arr[3].equals("FAIL"))
.isPresent();
答案 1 :(得分:2)
即使@Eugene的回答更强富有表现力,但我认为您也可以将整个regex
分成几部分以清楚地表达。例如:
private static final String PREFIX = "\\w+";
private static final String DIGIT12 = "(?:[1-9]\\d{11}|0\\d{11})";
private static final String TIMESTAMP = "[1-9]\\d{11}";
private static final String STATUS = "(?:PASS|FAIL)";
private static final String EXTENSION = "\\p{Alpha}+";
private static final String FILENAME_REGEX =
format("%s_%s_%s_%s\\.%s", PREFIX, DIGIT12, TIMESTAMP, STATUS, EXTENSION);
private boolean validateFile(String fileName) {
return fileName.matches(FILENAME_REGEX);
}