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表达式的主要内容,如果未能解决你的问题,请参考以下文章