Получить список целых чисел из массива строк - PullRequest
0 голосов
/ 03 сентября 2018

Я бы хотел, чтобы мой код выглядел более эффективным. В настоящее время я получил что-то вроде этого:

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 внутри лямбды, но я хотел бы сохранить свой метод отдельно.

Может быть, у кого-то есть другие идеи, пожалуйста, не стесняйтесь публиковать любые идеи. Ура!

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы можете сделать это так,

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.

0 голосов
/ 03 сентября 2018

Использование Stream API может сделать его короче, предположим, extractFileNumber находится в классе Main:

return Stream.of(files).map(Main::extractFileNumber).collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...