Java8 -Lambda表达式(2)

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

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


Java8 -Lambda表达式(2)_第1张图片

  例如:在以下代码中就是从一个从文件中读取一行所需的模板代码(注意: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());

你可能感兴趣的:(Java8 -Lambda表达式(2))