慕桂英3389331
2022-05-25 17:28:16
目前我有一些代碼返回我的文件名和擴展名,為此我正在使用 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貢獻(xiàn)1798條經(jīng)驗 獲得超7個贊
您通過多次將路徑轉(zhuǎn)換為字符串來浪費資源。當(dāng)預(yù)期的最終結(jié)果無論如何都是一個字符串時,您可以作為第一步映射到一個字符串,因此您不需要重復(fù)它。
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 的惰性,它仍然只會應(yīng)用于這里的第一個匹配元素。但我更喜歡將.endsWith(".txt")
測試和后續(xù)測試.substring(0, name.length()-".txt".length())
盡可能地放在一起,以使這兩個步驟之間的關(guān)系更加明顯。

米琪卡哇伊
TA貢獻(xiàn)1998條經(jīng)驗 獲得超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();
或者修改當(dāng)前地圖這樣做 -
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貢獻(xiàn)1799條經(jīng)驗 獲得超8個贊
如果要使用流,則僅刪除擴展名是不值得的。使用類似下面的東西,但它也有一些缺點,比如dd.txt.txt
will fetch dd.txt
。
String trimmedString = str.substring(0, str.lastIndexOf('.'));
添加回答
舉報
0/150
提交
取消