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

标签 java lambda java-8 java-stream

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

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

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

最佳答案

多次将路径转换为字符串是在浪费资源。当预期的最终结果无论如何是一个字符串时,您可以在第一步直接映射到一个字符串,因此您不需要重复它。

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

关于java - 在流的帮助下从文件名中删除扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54436783/

相关文章:

java - Android 和 iOS 中的文件安全

java - 从另外两个 arrayList 创建一个 arrayList 并仅保留两个 arrayList 中相同的值

java - Webview 设置 overrideurl 未使用

c++ - 将 C++ lambda 转换为 C 函数

C++11 lambda 返回 lambda

java - 解析和翻译 Java 8 lambda 表达式

java - 将链接的对象变成流或集合

java - paintComponent 不可见 java

C# lambda 表达式反向 <=

java - 对 int 数组列表进行分组