Java 8代码阅读

C L*_*Luo 3 java java-8

这段Java代码很难理解.这个DirExplorer是如何创建的?DirExplorer类链接是https://github.com/ftomassetti/analyze-java-code-examples/blob/master/src/main/java/me/tomassetti/support/DirExplorer.java 干杯,代码如下:

 new DirExplorer((level, path, file) -> path.endsWith(".java"), (level, path, file) -> {
        System.out.println(path);
        System.out.println(Strings.repeat("=", path.length()));
        try {
            new VoidVisitorAdapter<Object>() {
                @Override
                public void visit(ClassOrInterfaceDeclaration n, Object arg) {
                    super.visit(n, arg);
                    System.out.println(" * " + n.getName());
                }
            }.visit(JavaParser.parse(file), null);
            System.out.println(); // empty line
        } catch (ParseException | IOException e) {
            new RuntimeException(e);
        }
    }).explore(projectDir);
Run Code Online (Sandbox Code Playgroud)

shi*_*zhz 6

让我们将代码重构为旧式以便于理解:

Filter filter = new Filter() {
    @Override
    public boolean interested(int level, String path, File file) {
        return path.endsWith(".java");
    }
};

FileHandler fileHandler = new FileHandler() {
    @Override
    public void handle(int level, String path, File file) {
        // Your long implementation for FileHandler
    }
};
new DirExplorer(filter, fileHandler).explore(projectDir);
Run Code Online (Sandbox Code Playgroud)

该变量filter是一个匿名类实现接口的实例Filter,该接口Filter只有一个方法,因此在Java 8中它是一个功能接口,上面的初始化代码可以通过Java 8中的lambda表达式缩短为:

Filter filter = (level, path, file) -> path.endsWith(".java");

FileHandler fileHandler = (level, path, file) -> {
    // Your implementation for FileHandler
};
new DirExplorer(filter, fileHandler).explore(projectDir);
Run Code Online (Sandbox Code Playgroud)

而且,你可以内联这两个变量,这导致代码:

new DirExplorer((level, path, file) -> path.endsWith(".java"), (level1, path1, file1) -> {
        // Your implementation for FileHandler
    }).explore(projectDir);
Run Code Online (Sandbox Code Playgroud)