如何将JDK8的Java代码迁移至JDK16?解决Long构造方法弃用警告
适配JDK16重构文件按日期排序方法
原代码中使用的new Long(long)构造器在JDK9及以后被标记为废弃(JDK16中明确标记为待移除),这是因为Java提供了更高效的自动装箱机制和直接比较原始类型的方法,无需显式创建Long对象。以下是几种重构方案:
方案1:修复废弃API并优化匿名内部类
public static File[] getFileListFromDirByDate(String dir, final boolean byAscendingDate) { File directory = new File(dir); if (!directory.isDirectory()) { return null; } File[] files = directory.listFiles(); // 新增空判断,避免listFiles返回null时触发空指针异常 if (files == null) { return null; } // 使用泛型Comparator<File>,省去强制类型转换 Arrays.sort(files, new Comparator<File>() { @Override public int compare(File o1, File o2) { long modifiedTime1 = o1.lastModified(); long modifiedTime2 = o2.lastModified(); // 用Long.compare直接比较原始long值,无需装箱 return byAscendingDate ? Long.compare(modifiedTime1, modifiedTime2) : Long.compare(modifiedTime2, modifiedTime1); } }); return files; }
方案2:用Lambda表达式简化代码(JDK8+适用)
Lambda表达式可替代匿名内部类,让代码更简洁:
public static File[] getFileListFromDirByDate(String dir, boolean byAscendingDate) { File directory = new File(dir); if (!directory.isDirectory()) { return null; } File[] files = directory.listFiles(); if (files == null) { return null; } Arrays.sort(files, (o1, o2) -> { long modifiedTime1 = o1.lastModified(); long modifiedTime2 = o2.lastModified(); return byAscendingDate ? Long.compare(modifiedTime1, modifiedTime2) : Long.compare(modifiedTime2, modifiedTime1); }); return files; }
方案3:用Comparator静态方法实现优雅排序(JDK8+适用)
利用JDK8新增的Comparator.comparingLong方法,进一步简化逻辑:
public static File[] getFileListFromDirByDate(String dir, boolean byAscendingDate) { File directory = new File(dir); if (!directory.isDirectory()) { return null; } File[] files = directory.listFiles(); if (files == null) { return null; } // 按文件修改时间升序排序 Comparator<File> dateComparator = Comparator.comparingLong(File::lastModified); // 如果需要降序,反转比较器 if (!byAscendingDate) { dateComparator = dateComparator.reversed(); } Arrays.sort(files, dateComparator); return files; }
关键改进点说明
- 替换
new Long(long)为Long.compare(long, long):直接比较原始long类型,避免不必要的装箱操作,同时解决API废弃警告 - 使用泛型
Comparator<File>:消除强制类型转换,提升代码类型安全性 - 新增
files == null判断:避免listFiles()因权限问题或目录为空返回null时,调用Arrays.sort触发空指针异常 - 简化代码结构:利用Lambda和Comparator静态方法,让代码更易读、易维护
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

