在流的帮助下从文件名中删除扩展名

时间:2019-01-30 09:02:18

标签: java lambda java-8 java-stream

当前,我有一些代码返回具有扩展名的fileName,并使用Java 8流api来实现。但我也想在同一Stream中修剪String。

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

有什么想法要从流中的字符串中删除.txt吗?

4 个答案:

答案 0 :(得分:2)

您正在通过多次将路径转换为字符串来浪费资源。无论如何,如果预期的最终结果是字符串,则可以首先将字符串映射为正确的字符串,因此无需重复。

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都没有关系。由于Stream的惰性,它仍将仅应用于此处的第一个匹配元素。但是我更喜欢将.endsWith(".txt")测试和随后的.substring(0, name.length()-".txt".length())保持尽可能靠近,以使这两个步骤之间的关系更加明显。

答案 1 :(得分:1)

删除如果要使用流,仅删除扩展名,则不值得。 使用如下所示的内容,但同样有一些缺点,例如dd.txt.txt会获取dd.txt

String trimmedString = str.substring(0, str.lastIndexOf('.'));

答案 2 :(得分:1)

您可以添加其他地图以删除文件扩展名-

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();

答案 3 :(得分:1)

只需使用:

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", "");
}