3.3 把Lambda付诸实践:环绕执行模式
资源处理的常见模式是围绕业务执行,处理资源。
- 初始化/准备代码;
- 执行业务;
- 清理/结束代码
带资源的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方法的过程: