Java8 -Lambda表达式(2)

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

  让我们通过一个例子,看看在实践中如何利用Lambda和行为参数化来让代码更加灵活,更加简洁。资源处理(例如处理文件或者数据库)时一个常见的模式就是打开一个资源,做一些处理,然后在关闭资源。这个设置和清理阶段总是很类似,并且会围绕着执行处理的那些重要代码。这就是所谓的环绕执行(execute around)模式。如下图所示



  例如:在以下代码中就是从一个从文件中读取一行所需的模板代码(注意:Java7中,带资源的try语句,它已经简化了代码,因为你不需要显示地关闭资源了)

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

  上面那段代码有局限性的。你只能读文件的第一行。你想要读取文件的前两行,甚至是返回使用最频繁的词,该怎么办呢?在理想的情况下,你要重用执行设置和清理的代码,并且告诉processFile方法对文件执行不同的操作。这听起来是不是很耳熟呢?是的,你需要把processFile的行为参数化。你需要一种方法把行为传递给processFile方法,以便他可以利用BufferedReader执行不同的行为。

(1).行为参数化

  传递行为正是Lambda的拿手好戏。那要是想一次读两行,这个新的processFile方法看起来又该是怎么样的呢?基本你需要一个接收BufferedRead并且返回String的Lambda。例如,下面就是从BufferedRead中打印两行的写法:

String reuslt = processFile(( BufferedReader b) -> b.readLine() + b.readLine());

(2).创建函数式接口

public interface BufferedReaderProcessor {
     String process(BufferedReader b) throws IOException;
}

   现在你就可以把这个接口作为processFile方法的参数了

public static String processFile(BufferedReaderProcessor b) throws IOException{

 }

(3).执行一个行为

  任何BufferedReader -> String形式的Lambda都可以可以作为参数来传递,因为他们都符合BufferedReaderProcessor接口中定义的process方法的签名。现在你只需要一种方法在processFile主体内执行Lambda所代表的代码。请记住,Lambda表达式允许你直接内联为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实例。因此,你可以在processFile主体内,对传递过来的BufferReaderProcessor对象调用process方法执行处理:

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

(4).传递Lambda

  现在你就可以传递不同的Lambda重用professFile方法,并且以不同的方式来处理文件。
  处理一行:

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

  处理两行:

 String reuslt = processFile(( BufferedReader b) -> b.readLine() + b.readLine());
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 概念 Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主...
    刘涤生阅读 3,223评论 5 18
  • Java8 实战学习 — Lambda 表达式 上一章,我们学习了参数化代码的实现方法,这个逻辑的推导对我自己来说...
    醒着的码者阅读 746评论 0 0
  • Lambda表达式 利用行为参数化这个概念,就可以编写更为灵活且可重复使用的代码。但同时,使用匿名类来表示不同的行...
    谢随安阅读 884评论 2 0
  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 1,259评论 1 2
  • 第一章 为什么要关心Java 8 使用Stream库来选择最佳低级执行机制可以避免使用Synchronized(同...
    谢随安阅读 1,517评论 0 4