原创首发
Java使用Lambda表达式对文件集合按规则进行排序操作

需求
想要提取文件夹下的文件名,并按规则进行排序。(~~没有需求也要创造需求。~~) 我最先想到的是bat批处理,列出当前文件夹下的文件名,然后用Excel对文件名进行排序,这很简单嘛~ 事实证明,我错了,Excel的自定义排序规则不会玩,默认排序和我想要的按序号进行排序有出入。
批处理命令如下:
dir *.*/b>本文件夹下的文件目录.txt
提取出来之后,是这个鬼样子,很明显这不符合我们想要的效果啊。
-----------------分割线-----------------
Java代码实现
低配版排序代码
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 低配版排序方式,想要定制排序只能自己改源码。
*/
public class SortFileListLow {
public static void main(String[] args) {
String filePath = "D:\\BaiduNetdiskDownload\\阳光沙滩\\阳光沙滩博客系统后端(更新完成)";
File file = new File(filePath);
if (!file.isDirectory()) {
System.out.println("======> This is not a folder object!");
return;
}
//列出文件夹下的 File 数组,但有可能为空(null or length == 0)。
File[] files = file.listFiles();
if (files == null || files.length == 0) {
System.out.println("======> There are no files in this folder!");
return;
}
//此处返回的 tempList 是 Arrays 类中的 静态内部类,操作有限制,如果执行 removeIf 方法就会报 UnsupportedOperationException 异常。
//请特别注意!!!
//请特别注意!!!
//请特别注意!!!
List<File> tempList = Arrays.asList(files);
//我们将该集合转化成 我们常用的 ArrayList 集合,这样后面执行 removeIf 方法时才不会发生 UnsupportedOperationException 异常。
List<File> fileList = new ArrayList<>(tempList);
//如果不包含 顿号 或者不以 .avi 结尾,都不是我们想要的视频文件,不需要参与排序。
fileList.removeIf(o -> (!o.getName().contains("、") || !o.getName().endsWith(".avi")));
fileList.sort((o1, o2) -> {
String o1Name = o1.getName();
String o2Name = o2.getName();
try {
//去除从 [、] 到 结尾的字符串(只剩下序号)进行升序排序,如果是 Integer.parseInt(o2Name) - Integer.parseInt(o1Name) 就是降序排序。
o1Name = o1Name.replace(o1Name.substring(o1Name.indexOf("、")), "");
o2Name = o2Name.replace(o2Name.substring(o2Name.indexOf("、")), "");
return Integer.parseInt(o1Name) - Integer.parseInt(o2Name);
} catch (NumberFormatException | IndexOutOfBoundsException e) {
//There is no need to handle these exceptions.
return 0;
}
});
//遍历并输出文件信息
fileList.forEach(System.out::println);
}
}
高配版排序代码
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
/**
* 高配版排序,排序规则更加定制化,想要怎么排,自己说了算!
*/
public class SortFileListAdvanced {
public static void main(String[] args) {
String filePath = "D:\\BaiduNetdiskDownload\\阳光沙滩\\阳光沙滩博客系统后端(更新完成)";
sort(filePath, file -> {
//返回true,代表该元素将从List集合中移除,false代表不移除。
// TODO: Do what you want.
return false;
}, name -> {
//将文件名转换成纯数字并返回,将以此数值进行排序。
// TODO: Get a clean file name.
return null;
});
}
private static void sort(String filePath, Predicate<? super File> filter, RenameInterface renameInterface) {
if (filter == null) {
System.out.println("======> Filter criteria cannot be empty!");
return;
}
File file = new File(filePath);
if (!file.isDirectory()) {
System.out.println("======> This is not a folder object!");
return;
}
//列出文件夹下的 File 数组,但有可能为空(null or length == 0)。
File[] files = file.listFiles();
if (files == null || files.length == 0) {
System.out.println("======> There are no files in this folder!");
return;
}
//此处返回的 tempList 是 Arrays 类中的 静态内部类,操作有限制,如果执行 removeIf 方法就会报 UnsupportedOperationException 异常。
//请特别注意!!!
//请特别注意!!!
//请特别注意!!!
List<File> tempList = Arrays.asList(files);
//我们将该集合转化成 我们常用的 ArrayList 集合,这样后面执行 removeIf 方法时才不会发生 UnsupportedOperationException 异常。
List<File> fileList = new ArrayList<>(tempList);
//如果不包含 顿号 或者不以 .avi 结尾,都不是我们想要的视频文件,不需要参与排序。
fileList.removeIf(filter);
fileList.sort((o1, o2) -> {
String o1Name = o1.getName();
String o2Name = o2.getName();
try {
//去除从 [、] 到 结尾的字符串(只剩下序号)进行升序排序,如果是 Integer.parseInt(o2Name) - Integer.parseInt(o1Name) 就是降序排序。
o1Name = renameInterface.targetName(o1Name);
o2Name = renameInterface.targetName(o2Name);
//接口返回的名字有可能为空(null or ""),为空就不排序。
if (TextUtils.isEmpty(o1Name) || TextUtils.isEmpty(o2Name)) {
return 0;
}
return Integer.parseInt(o1Name) - Integer.parseInt(o2Name);
} catch (NumberFormatException | IndexOutOfBoundsException e) {
//There is no need to handle these exceptions.
return 0;
}
});
//遍历并输出文件信息
fileList.forEach(System.out::println);
}
interface RenameInterface {
String targetName(String name);
}
private static class TextUtils {
private static boolean isEmpty(String text) {
return text == null || text.length() == 0;
}
}
}
运行效果的部分截图
请同学们点赞、评论、打赏+关注啦~
本文由
A lonely cat
原创发布于
阳光沙滩
,未经作者授权,禁止转载