初步理解Lambda表达式和行为参数化

现在我们要对一个文件资源进行操作,比如读取它的第一行。

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());
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容