Удалить расширение из имени файла с помощью потока - PullRequest
0 голосов
/ 30 января 2019

В настоящее время у меня есть код, который возвращает мне fileName с расширением, и для этого я использую java 8 stream api.Но я хотел бы также обрезать строку в том же потоке.

return Files.walk(Paths.get(qPath))
                      .filter(extension -> extension.toString().endsWith(".txt"))
                      .map(Path::getFileName)
                      .findFirst()
                      .map(Path::toString)
                      .get();

Есть идеи, как удалить .txt из String в потоке?

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Вы тратите ресурсы, конвертируя путь в строку несколько раз.Если предполагаемый конечный результат в любом случае является строкой, вы можете отобразить строку прямо как первый шаг, поэтому вам не нужно повторять ее.

return Files.walk(Paths.get(qPath))
    .map(p -> p.getFileName().toString())
    .filter(name -> name.endsWith(".txt"))
    .map(name -> name.substring(0, name.length()-".txt".length()))
    .findFirst()
    .get();

Обратите внимание, что не имеет значения, являетесь ли выпоместите последний шаг .map(…) перед findFirst(), т.е. примените его к потоку или после него, применив его к Optional.Из-за ленивого характера потока он все равно будет применяться только к первому соответствующему элементу.Но я предпочитаю держать тест .endsWith(".txt") и последующий .substring(0, name.length()-".txt".length()) как можно ближе друг к другу, чтобы сделать связь между этими двумя шагами более очевидной.

0 голосов
/ 30 января 2019

Вы можете добавить дополнительную карту, чтобы удалить расширение файла -

Files.walk(Paths.get(""))
        .filter(extension -> extension.toString().endsWith(".txt"))
        .map(Path::getFileName)
        .findFirst()
        .map(Path::toString)
        .map(fileNameStr -> fileNameStr.substring(0, fileNameStr.lastIndexOf('.'))
        .get();

Или изменить текущую карту, чтобы сделать это -

Files.walk(Paths.get(""))
        .filter(extension -> extension.toString().endsWith(".txt"))
        .map(Path::getFileName)
        .findFirst()
        .map(path -> path.getFileName().toString().substring(0, path.getFileName().toString().lastIndexOf('.')))
        .get();
0 голосов
/ 30 января 2019

Просто используйте:

String fileName = Files.walk(Paths.get(PATH))
                       .filter(extension -> extension.toString().endsWith(".txt"))
                       .map(Path::getFileName)
                       .findFirst().map(Path::toString).get().replace(".txt", "");

Предположим, что файл отсутствует, и чтобы исключить NoSuchElementException использование:

Optional<Path> findFirstFile = Files.walk(Paths.get(PATH))
        .filter(extension -> extension.toString().endsWith(".txt"))
        .map(Path::getFileName).findFirst();

if (findFirstFile.isPresent()) {
    String fileName = findFirstFile.get().toString().replace(".txt", "");
}
0 голосов
/ 30 января 2019

Удалить просто расширение, если вы хотите использовать поток, то оно того не стоит.Используйте что-то вроде ниже, но опять же у него есть некоторые недостатки, такие как dd.txt.txt будет получать dd.txt.

String trimmedString = str.substring(0, str.lastIndexOf('.'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...