现在我们要对一个文件资源进行操作,比如读取它的第一行。
public String processFile() throws IOException{
try (BufferedReader br = new BufferedReader(new FileReader("C:\\Test.txt"))){
return br.readLine();
}
}
如果我们这个时候需要读取多行的话,按照正常的思维,应该把读取行数的这个操作抽出来变成count参数,控制函数内部执行readLine的次数
public String processFile(int count) throws IOException{
try (BufferedReader br = new BufferedReader(new FileReader("C:\\Test.txt"))){
//操作
}
}
如果还要继续改需求,变成寻找这个文件中出现频率最高的词。那就是把关键词作为参数传进去
public String processFile(String key) throws IOException{
try (BufferedReader br = new BufferedReader(new FileReader("C:\\Test.txt"))){
//操作
}
}
从上面可以看出,对资源进行某种操作都是比较固定的做法,如果需要改需求的话,需要不断的写一个新的方法,而且每个方法的开头结尾都一样。
如果不把某一个具体的操作抽象成参数,而是把整个操作都抽象成参数(行为参数化),我只要把我的不同行为传进去,函数内部就能自行处理,那么写一个方法就能满足上面的需求了。而传递行为就是Lambda表达式的拿手好戏。
//首先定义一个创建一个能匹配 BufferedReader -> String,还可以抛出IOException异常的接口。
//就是传递一个BufferedReader,返回一个字符串String
@FunctionalInterface
public interface BufferedReaderProcessor {
String process(BufferedReader br) throws IOException;
}
//将BufferedReaderProcessor这个“行为”作为参数传进去
public String processFileLambda(BufferedReaderProcessor bp) throws IOException{
try (BufferedReader br = new BufferedReader(new FileReader("C:\\Test.txt"))){
return bp.process(br);
}
}
只要我的行为符合接口的BufferedReader -> String规则,就可以随意做其他操作了
String oneLine = processFileLambda((BufferedReader br) -> br.readLine());
String twoLines = processFileLambda((BufferedReader br) -> br.readLine() + br.readLine());