如何在Java流操作中按部分文件名对文件进行排序
你只需要替换Comparator.comparing中的键提取函数,把方法引用File::getName改成自定义Lambda表达式,在表达式中完成文件名的截取逻辑即可。
使用Apache Commons Lang StringUtils的实现
如果你已经引入了Apache Commons Lang依赖,直接按你想要的效果写就行:
Files.list(Paths.get(importDir)) .map(Path::toFile) .sorted(Comparator.comparing( // 自定义键提取逻辑,只取文件名第一个下划线前的内容作为排序依据 file -> StringUtils.substringBefore(file.getName(), "_"), // 可选配置:处理没有下划线、文件名空的异常情况,不区分大小写排序 Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER) ) .thenComparingLong(File::lastModified)) .forEachOrdered(file -> System.out.println(file.getName()));
无第三方依赖的原生实现
不想引入额外依赖的话,自己写截取逻辑即可:
Files.list(Paths.get(importDir)) .map(Path::toFile) .sorted(Comparator.comparing(file -> { String fileName = file.getName(); int firstUnderlineIdx = fileName.indexOf('_'); // 没有下划线的文件直接用完整文件名排序 return firstUnderlineIdx == -1 ? fileName : fileName.substring(0, firstUnderlineIdx); }) .thenComparingLong(File::lastModified)) .forEachOrdered(file -> System.out.println(file.getName()));
注意事项
- 不需要额外修改后续的
thenComparingLong逻辑,第一排序规则匹配不上时仍然会按修改日期排序。 - 如果你需要严格区分大小写排序,去掉
String.CASE_INSENSITIVE_ORDER参数即可,默认会按字符串自然序区分大小写。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

