Lambda实践-环绕执行模式

使用Lambda和行为参数化来让代码更为灵活,更为简洁。

资源处理(例如处理文件或数据库)时一个常见的模式就是打开一个资源,做一些处理,然后关闭资源。这个设置和清理阶段总是很类似,并且会围绕着执行处理的那些重要代码。这就是所谓的环绕执行(execute around)模式。

public static String processFile() throws IOException{
    BufferedReader br = null;
    try{
        //初始化
        br = new BufferedReader(new FileReader("data.txt"));
        
        //业务代码执行
        return br.readLine();
    }finally{
        //清理代码
        br.close();
    }
}

第1步:行为参数化

当前代码是有局限性的,目前只能读文件的第一行。如果想要返回头两行、或者返回使用最频繁的词,该怎么办呢?

理想情况下,要重用执行设置清理的代码,并告诉processFile方法对文件执行不同的操作。

所以需要把processFile的行为参数化。需要一种方法把行为传递给processFile,以便它可以利用BufferedReader执行不同的行为。

这个新的processFile方法看起来是什么样子呢?

String result = processFile((BufferedReader br) -> br.readLine()+br.readLine());

第2步:使用函数式接口来传递行为

Lambda仅可用于上下文是函数式接口的情况,所以需要创建一个能匹配BufferedReader -> String,还可以抛出IOException异常的接口:

public interface BufferedReaderProcessor{
    String process(BufferedReader b) throws IOException;
}

现在就可以把这个接口作为新的processFile方法的参数了:

public static String processFile(BufferedReaderProcessor p) throws IOException{
    ......
}

第3步:执行一个行为

Lambda表达式允许直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实例。

public static String processFile(BufferedReaderProcessor p) throws IOException{
    BufferedReader br = null;
    try{
        //初始化
        br = new BufferedReader(new FileReader("data.txt"));
        //处理BufferedReader对象
        return p.process(br);
    }finally{
        //清理代码
        br.close();
    }
}

第4步:传递Lambda

现在就可以通过传递不同的Lambda重用processFile方法,并以不同的方式处理文件了:

处理一行:

String oneLine = processFile((BufferedReader br) -> br.readLine());

处理两行:

String oneLine = processFile((BufferedReader br) -> br.readLine()+br.readLine());

你可能感兴趣的:(Java8,java,数据库,开发语言)