Java▲在被疯狂嘲讽之后,我决定研究下Java中的过滤器源码


Java▲在被疯狂嘲讽之后,我决定研究下Java中的过滤器源码
文章图片
Java▲在被疯狂嘲讽之后,我决定研究下Java中的过滤器源码
文章图片
Java▲在被疯狂嘲讽之后,我决定研究下Java中的过滤器源码
文章图片
今天是我自学Java的第40天 。

感谢你的观看 , 谢谢你 。
话不多说 , 开始今天的学习:
昨天学习了过滤器 , 它的作用在于能够过滤出满足一定条件的文件 。 跟着依样画葫芦 , 我自己也写了一个过滤器 。
正当我满以为自己对面向接口编程这一思想掌握的还算不错时 , 却被不停地嘲讽 。
仔细想了想觉得他们说的也还蛮有道理的 , 自己确实还很菜 , 不能坐井观天 , 要有敬畏之心 。
所以我决定撸下文件过滤器的源码 , 我确实写的菜 , 但Java里的源码是Java开发者几十年来智慧的结晶 , 总不能说它菜了吧?
对于我这样的Java萌新来说 , 看源码确实是一件比较吃力的事情 , 这也是自己一直比较恐惧的事情 。
但人在嘲笑中变强 , 所以我想试一试 。
注意:

  • Javaweb过滤器还没学到 , 暂时不清楚 。
  • 迭代我也不懂 , 暂时只会递归 。
一、JDK中的文件过滤器其实在JDK中 , Java底层已经定义好了一个过滤器接口 , 源码如下:
①接口FileFilter
File文件 , Filter过滤器 , 顾名思义 , 这就是专门用来解决文件过滤问题的接口 。
②方法accept
参数:File对象;返回值:布尔值 。
  • 如果返回值为真 , 就将file保存下来;
  • 如果返回值为假 , 就将file不保存 。
具体的过滤条件 , 在重写accept方法时说明就好了 。
该接口只有一个方法 , 也就是说其为函数式接口 , 所以可以使用lambda表达式 。
二、JDK中过滤器的封装JDK将过滤器封装在listFiles方法中了 。
listFiles方法有几个重载方法:
  • listFiles():遍历文件夹中的子文件或者子文件夹 。
  • listFiles(FileFilter filter):按照过滤条件遍历文件夹中对应的子文件或者子文件夹 。
JDK中源码如下:
我们来一步一步地分析:
①listFiles(FileFilter filter)
参数:FileFilter接口 , 那么我们若是要调用这个方法 , 必须要传入FileFilter接口的实现类对象(使用匿名内部类或者lambda表达式) 。
返回值:一个文件数组 。
②String ss[
=list()
这个是啥呢?这里省略了一个this关键字 。
也就是this.list() , File类有一个list方法 , 也是用来文件夹的遍历 , 给一个文件对象 , 返回一个字符串数组 。
file对象在调用listFiles方法时 , 其底层也会调用一次list方法 , 如果字符串数组为空 , 那么直接返回空 。
③ArrayList<File> files = new ArrayList<>();
创建一个ArrayList集合files , 泛型为File , 也就是说files这个集合只能用来存储File对象 。
④for(String s::ss){;
增强for循环遍历ss , 遍历出来的也就是子文件或者子文件夹对应字符串名字 。
⑤File f = new File(s this);
这是新创建了一个file对象 , 相当于遍历出来的子文件或者子文件夹 。


推荐阅读