今天还是没事看了看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. HDFS读写过程

    HDFS的读写过程: 读过程: Client收到用户的读请求——client拿着path向namenode请求文件或者block的datanode列表——client从返回的datanode列表中选择 ...

  2. 01-python中字符串的常见操作

    (1)find 检测str是否包含在myStr中,如果存在则返回开始的索引值,否则返回-1. In [1]: myStr = "hello world tairan and tairanCi ...

  3. linux下在用户空间访问I/O端口的ioperm和iopl函数

    1.ioperm函数      功能描述:为调用进程设置I/O端口访问权能.ioperm的使用需要具有超级用户的权限,只有低端的[0-0x3ff] I/O端口可被设置,要想指定更多端口的权能,可使用i ...

  4. javascript 一些关于css操作的函数

    // 通过样式表 获得css样式 //obj 表示dom对象,name 表示css属性 比如width等 function getStyle(obj,name){ if(obj.currentStyl ...

  5. RHEL简单管理SELINUX

    Security Enhanced Linux(SELinux)是一个额外的系统安全层,主要目的是防止已遭泄露的系统服务访问用户数据. 对于一个服务来说,要关注SELinux的三个方面,一是文件SEL ...

  6. 异常---ment.getElementById("searchForm").submit is not a function

    今天在写代码的时候JS一直报上面这个错.搞了半天一直想不明白 .我看别的页面都是这样写了就是没有一点错.. 可能是写了一个晚上的代码..头有点晕..后来终于找到原因了..浪费我两个小时啊..杯具.. ...

  7. C#图解教程 第七章 类和继承

    类和继承 类继承访问继承的成员所有类都派生自object类屏蔽基类的成员基类访问使用基类的引用 虚方法和覆写方法覆写标记为override的方法覆盖其他成员类型 构造函数的执行 构造函数初始化语句类访 ...

  8. layer与iframe 间值的相互传递

    在A页添加 <input id="handle_status" value="" hidden="hidden"> jq代码 l ...

  9. 【UVa11426】GCD - Extreme (II)(莫比乌斯反演)

    [UVa11426]GCD - Extreme (II)(莫比乌斯反演) 题面 Vjudge 题解 这.. 直接套路的莫比乌斯反演 我连式子都不想写了 默认推到这里把.. 然后把\(ans\)写一下 ...

  10. 【BZOJ4825】【HNOI2017】单旋(Link-Cut Tree)

    [BZOJ4825][HNOI2017]单旋(Link-Cut Tree) 题面 题面太长,懒得粘过来 题解 既然题目让你写Spaly 那就肯定不是正解 这道题目,让你求的是最大/最小值的深度 如果有 ...