文件名验证

时间:2017-08-02 20:37:56

标签: java string java-8 java-stream

我每分钟在一个线程中验证目录中的许多文件。 目前我正在使用下面的功能,工作正常。 我的问题是我是否可以重写此方法以更快地运行(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;
}

验证规则:

  1. 文件名不能包含任何空白字符。
  2. 文件名拆分器始终为 _ 字符。
  3. 值[1]不能只包含零( 0 )。它必须有12位数字。
  4. 值[3]必须包含“PASS”或“FAIL”。
  5. 数组值[]长度必须始终为4.
  6. 您可以使用http://ideone.com/dh8j9M

    上的文件名示例运行并分叉此代码

2 个答案:

答案 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);
}