当前,我有一些代码返回具有扩展名的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吗?
答案 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", "");
}