原创首发    
 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
          原创发布于
          阳光沙滩
          ,未经作者授权,禁止转载
        
 

 A lonely cat  回复 @断点-含光君
 A lonely cat  回复 @断点-含光君 



























