今天仍是沒事看了看elfinder源碼,發現以前說的兩個版本實現都是基於不一樣的jdkelfinder源碼瀏覽-Volume文件系統操做類(1),html
帶前端頁面的是基於1.6中File實現,另外一個是基於1.7中的Path實現,前端
今天看了一個很是有意思的匿名類應用,先看基礎java中一個引人深思的匿名內部類java
其中引發我注意的是一個文件搜索的實現,app
項目代碼並無引發個人問題,但深思的是基於1.8源碼的實現使用了一個ide
@@@@@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()]); }
使人深思的是下面咱們它的實現post
NIOHelper類spa
此類是我今天看到的一個匿名接口使用.net
/** * 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(); }
至此咱們已經看完了這個實現的具體應用,發現原來匿名類是如此的強大,徹底少寫不少以前寫代碼中的邏輯判斷