You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:54:08