目前我有一些代码返回我的文件名和扩展名,为此我正在使用 java 8 流 api。但我也想在同一个流中修剪字符串。return Files.walk(Paths.get(qPath))
.filter(extension -> extension.toString().endsWith(".txt"))
.map(Path::getFileName)
.findFirst()
.map(Path::toString)
.get();知道如何从流中的字符串中删除 .txt 吗?
3 回答

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

米琪卡哇伊
TA贡献1998条经验 获得超6个赞
您可以添加其他地图以删除文件扩展名 -
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();

守着星空守着你
TA贡献1799条经验 获得超8个赞
如果要使用流,则仅删除扩展名是不值得的。使用类似下面的东西,但它也有一些缺点,比如dd.txt.txt
will fetch dd.txt
。
String trimmedString = str.substring(0, str.lastIndexOf('.'));
添加回答
举报
0/150
提交
取消