3.3 把Lambda付诸实践:环绕执行模式

资源处理的常见模式是围绕业务执行,处理资源。

  1. 初始化/准备代码;
  2. 执行业务;
  3. 清理/结束代码

带资源的try语句,会自动清理资源。

public static String processFile() throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
        return br.readLine();
    }
}

通过行为参数化和Lambda表达式重构,使代码更为灵活、简洁。

3.3.1 第1步:记得行为参数化

当前执行的业务是固定读取文件的第一行,无法扩展其它的业务,例如读取文件前两行,或者返回使用最频繁的词。

行为参数化改造,使其能传递行为执行。

例如读取文件前两行:

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

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

创建函数描述符为BufferedReader->String的函数式接口。

@FunctionalInterface
public interface BufferedReaderProcessor {
    String process(BufferedReader br) throws IOException;
}

函数签名的行为参数化改造。

public static String processFile(BufferedReaderProcessor processor) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
        return br.readLine();
    }
}

3.3.3 第3步:执行一个行为

public static String processFile(BufferedReaderProcessor processor) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
        return processor.process(br);
    }
}

3.3.4 第4步:传递Lambda

和普通方法调用一样,注意异常的捕获处理。

try {
    String oneLine = processFile((BufferedReader br) -> br.readLine());
} catch (IOException e) {
    // deal exception
}

try {
    String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());
} catch (IOException e) {
    // deal exception
}

基于行为参数化和Lambda表达式重构processFile方法的过程:

Lambda表达式重构过程
posted @ 2023-06-28 17:40  夜是故乡明  阅读(4)  评论(0编辑  收藏  举报