猿问

借助流从文件名中删除扩展名

目前我有一些代码返回我的文件名和扩展名,为此我正在使用 java 8 流 api。但我也想在同一个流中修剪字符串。

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

知道如何从流中的字符串中删除 .txt 吗?


慕桂英3389331
浏览 123回答 3
3回答

元芳怎么了

您通过多次将路径转换为字符串来浪费资源。当预期的最终结果无论如何都是一个字符串时,您可以作为第一步映射到一个字符串,因此您不需要重复它。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())尽可能地放在一起,以使这两个步骤之间的关系更加明显。

米琪卡哇伊

您可以添加其他地图以删除文件扩展名 -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();

守着星空守着你

如果要使用流,则仅删除扩展名是不值得的。使用类似下面的东西,但它也有一些缺点,比如dd.txt.txtwill fetch dd.txt。String trimmedString = str.substring(0, str.lastIndexOf('.'));
随时随地看视频慕课网APP

相关分类

Java
我要回答