今天还是没事看了看elfinder源码,发现之前说的两个版本实现都是基于不同的jdkelfinder源码浏览-Volume文件系统操作类(1),

带前端页面的是基于1.6中File实现,另一个是基于1.7中的Path实现,

今天看了一个非常有意思的匿名类应用,先看基础java中一个引人深思的匿名内部类

其中引起我注意的是一个文件搜索的实现,

项目代码并没有引起我的问题,但深思的是基于1.8源码的实现使用了一个

@@@@@DirectoryStream.Filter<Path>接口,此接口是一个包装接口,使用了java1.8中的接口函数式方法@FunctionalInterface@@@@@@@@@@@@@@@@

请先参考java1.7中新增的NIOJAVA NIO:Path ,File

首先先看一看此方法应用,此方法获取给定的工作空间中非隐藏的文件列表,

包装Volume类
  @Override
public Target[] listChildren(Target target) throws IOException {
//其中这里使用了一个NioHelper工具类封装了之前定义的Path接口,来获取非隐藏文件 List<Path> childrenResultList = NioHelper.listChildrenNotHidden(fromTarget(target));
List<Target> targets = new ArrayList<>(childrenResultList.size());
for (Path path : childrenResultList) {
targets.add(fromPath(path));
}
return targets.toArray(new Target[targets.size()]);
}

令人深思的是下面我们它的实现

NIOHelper类

此类是我今天看到的一个匿名接口使用

  /**
* Gets children paths from the give directory (excluding hidden files).
* 带有文件过滤的
* @param dir path to the directory.
* @return the children paths from the give directory.
* @throws IOException if something goes wrong.
*/
public static List<Path> listChildrenNotHidden(Path dir) throws IOException {
// not hidden file filter
//
DirectoryStream.Filter<Path> notHiddenFilter = new DirectoryStream.Filter<Path>() {
public boolean accept(Path path) throws IOException {
return !Files.isHidden(path);
}
};
    //调用了同级类中的方法listChildren
return listChildren(dir, notHiddenFilter);
}
  /**
* Gets children paths from the give directory appling the given filter.
* 依据NIO中Files类中newDirectoryStream方法传入一个
    DirectoryStream.Filter接口来判断是否是隐藏目录,如果是就舍弃,不是就加入一个list中,
    然后使用Collrctions中的unmodifiableList设置此list不可更改,
    通过判断传入的dir来让Collrctions中emptyList方法设置返回的list是否是一个空的
* @param dir path to the directory. * @param filter the filter to be applied * @return the children paths from the give directory. * @throws IOException if something goes wrong. */ 
public static List<Path> listChildren(Path dir, DirectoryStream.Filter<? super Path> filter) throws IOException {
    if (isFolder(dir)) { List<Path> list = new ArrayList<>();
try (DirectoryStream<Path> directoryStream = (filter != null ? Files.newDirectoryStream(dir, filter) : Files.newDirectoryStream(dir))) {
for (Path p : directoryStream) {
list.add(p);
}
}
return Collections.unmodifiableList(list);
}
return Collections.emptyList();
}

至此我们已经看完了这个实现的具体应用,发现原来匿名类是如此的强大,完全少写很多之前写代码中的逻辑判断

elfinder中通过DirectoryStream.Filter实现筛选隐藏目录(二)的更多相关文章

  1. django-filter 使用Filter来筛选你的数据

    django-filter Django-filter is a generic, reusable application to alleviate writing some of the more ...

  2. Python day11 filter函数筛选数据,reduce函数压缩数据的源码详解

    1.filter滤波器函数定义一个数组,需求:过滤出带ii的字符串 arr=['dsdsdii','qqwe','pppdiimmm','sdsa','sshucsii','iisdsa'] def ...

  3. js Array 中的 map, filter 和 reduce

    原文中部分源码来源于:JS Array.reduce 实现 Array.map 和 Array.filter Array 中的高阶函数 ---- map, filter, reduce map() - ...

  4. Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例

    Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...

  5. Android中的Intent Filter匹配规则介绍

    本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家: ) 1. Intent简介 Intent用于在一个组件(Component,如Activity ...

  6. java Servlet中的过滤器Filter

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

  7. jQuery中find()和filter()的区别

    filter(expr):筛选出与指定表达式匹配的元素的元素集合,其中expr可以是多个选择器的组合.是对自身集合元素的筛选. find()会在元素内寻找匹配元素,而filter()是筛选元素:是对它 ...

  8. IOS开发中UIBarButtonItem上按钮切换或隐藏实现案例

    IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add bu ...

  9. css3中强大的filter(滤镜)属性

    CSS3中强大的filter(滤镜)属性 博主最近在做网站的过程中发现了一个非常强大的CSS3属性,就是filter(滤镜)属性,喜欢p图的朋友看名字都应该知道这是什么神器了吧.当然,这个属性的效果肯 ...

随机推荐

  1. 云摘录︱Word2Vec 作者Tomas Mikolov 的三篇代表作解析

    本文来源于公众号paperweekly 谈到了word2vec作者的三篇论文: 1.Efficient Estimation of Word Representation in Vector Spac ...

  2. R语言︱R社区的简单解析(CRAN、CRAN Task View)

    笔者寄语:菜鸟笔者一直觉得r CRAN离我们大家很远,在网上也很难找到这个社区的全解析教程,菜鸟我早上看到一篇文章提到了这个,于是抱着学渣学习的心态去看看这个社团的磅礴.威武. CRAN(The Co ...

  3. linq根据传入数据集合查询对应子级数据

    工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 ...

  4. Angular21 动态绑定CSS样式

    1 需求 在前端开发中通常需要动态对某些元素的样式进行动态设定,传统的CSS绑定分为CSS类绑定和Style样式绑定:在Angular中利用相关指令同样可以完成CSS类绑定和CSS样式绑定 2 内置指 ...

  5. Docker 入门之swarm部署web应用

    笔者近期在利用的docker搭建一个swarm集群,目前的应用还是入门级的,读者可自行根据自己的需要修改自己需要部署的应用,今天笔者介绍的是一个web应用的swarm集群的搭建.看这篇文章之前,我希望 ...

  6. Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台

    完成一套精准,漂亮图形化监控系统从这里开始第一步 Telegraf是收集和报告指标和数据的代理 它是TICK堆栈的一部分,是一个用于收集和报告指标的插件驱动的服务器代理.Telegraf拥有插件或集成 ...

  7. Css多列语法笔记

    columns多列属性定义: column-width:规定列的宽度(此宽度是缩放scale以后的最小宽度): column-count:规定元素被分隔的列数: column-rule设置所有colu ...

  8. 通过分析HSL/HSB获取图片主色调

    这两天稍微研究了一下颜色的HSL/HSB值,主要因为写程序想要实现通过一张图片拿到图片中的最突出的颜色值(类似Groove Music中播放栏背景就是从专辑封面中取出主色调,还有Windows 10任 ...

  9. 【POJ1151】Atlantis(线段树,扫描线)

    [POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...

  10. 【BZOJ1834】网络扩容(最大流,费用流)

    [BZOJ1834]网络扩容(最大流,费用流) 题面 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下 ...