代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Main {
@FunctionalInterface
public interface BufferedReaderProcessor {
String process(BufferedReader b) throws IOException;
}
public static String processFile(BufferedReaderProcessor p) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader("Resource\\data.txt"))) {
return p.process(br);
}
}
public static void main(String[] args) throws IOException{
String oneLine =
processFile((BufferedReader br) -> br.readLine());//直接内联,为函数式接口提供实现
System.out.println(oneLine);
System.out.println("Hello World!");
}
}
我的理解:
这里函数式接口是
BufferedReaderProcessor,
接口中有一个方法process。
首先通过Lambda表达式
(BufferedReader br) -> br.readLine()
作为一个函数式接口实现的实例,整体传递进去,这时接口有了实现。
- 这一点很重要:Lambda表达式实现的是接口中的方法
执行processFile中的程序,当
BufferedReader br =
new BufferedReader(new FileReader(“data.txt”))
执行结束后,return返回值会调用 br.readLine(),因为Lambda表达式实现的是接口中的方法,相当于执行
String process(BufferedReader br) throws IOException{
return br.readLine();
}
Lambda表达式行为参数化
- 将代码的签名写出来:
签名:BufferedReader->String - 满足签名、异常处理的接口
- 实现行为的方法
- 调用行为方法,使用Lambda表达式实例化接口