Java8-Lambda表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8-Lambda表达式相关的知识,希望对你有一定的参考价值。

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

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

技术分享

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

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

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

  (1).行为参数化

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

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

 

  (2).创建函数式接口

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

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

1     public static String processFile(BufferedReaderProcessor b) throws IOException{
2 
3     }

   (3).执行一个行为

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

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

  (4).传递Lambda

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

  处理一行:

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

  处理两行:

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

 

以上是关于Java8-Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java8-Lambda表达式

如何理解这段代码片段中的两对括号?

通过 Java 正则表达式提取 semver 版本字符串的片段

4.3 合并重复的条件执行片段

在 intellij 上调试评估表达式

sublimetext3中保存代码片段