从字符串数组获取整数列表

时间:2018-09-03 07:42:37

标签: java collections stream

我想使我的代码看起来更有效率。目前我有这样的东西:

private static String[] getAllFilesFromDirectory(String path) {
    File file = new File(path);
    String fileNamePattern = file.getName() + ".*\\.[0-9]*\\.GOOD";
    File dir = new File(file.getParent());

    String[] files = dir.list((currDir, currName) -> currName.matches(fileNamePattern));

    return files;
}
private static List<Integer> getAllFileNumbers(String path) {
    String[] files = getAllFilesFromDirectory(path);
    List<Integer> fileNumbers = new ArrayList<>();

    for (String currentFile : files) {
        fileNumbers.add(extractFileNumber(currentFile));
    }

    return fileNumbers;
}

private static Integer extractFileNumber(String fileName) {
    return Integer.parseInt(fileName.split("\\.")[2]);
}

第一件事。对于getAllFileNumbers方法,我将路径传递到目录,此后,我将在目录中获取具有特定模式的文件数组。并且我需要从每个文件中提取数字。 示例:

test.txt.1.fail
test2.txt.2.good
test3.pdf.1.good

我在这里返回以下数字的列表:1, 2, 1

我想更改什么?可能使用流api而不是foreach循环。 第一个想法是这样的:

Arrays.stream(files).map(this::extractFileNumber).collect(Collectors.toList());

但是因为方法是静态的,所以我不能像这样使用它。 显然,我可以将extractFileNumber移到lambda里面,但是我想分开保存我的方法。

也许有人有其他想法,请随时发表任何想法。干杯!

2 个答案:

答案 0 :(得分:1)

假设extractFileNumber位于类Main中,使用流api可以使其更短:

return Stream.of(files).map(Main::extractFileNumber).collect(Collectors.toList());

答案 1 :(得分:1)

您可以这样做

List<Integer> result = Arrays.stream(files)
    .map(s -> extractFileNumber(s))
    .collect(Collectors.toList());

如果要使用方法引用,应该是这样,

List<Integer> result = Arrays.stream(files)
    .map(FileNameEx::extractFileNumber)
    .collect(Collectors.toList());

FileNameEx是您的班级。您不能将this引用用于static方法。