lambda表达式是什么?
参考《Java8实战》
系列承接:呱呱8-1-行为参数化
8.【欧阳上智】代表性名言:
生,要享受自己双手所创下的成果;
死,要死在自己双手所持的利刃下。
- lambda表达式是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象 (lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
- 它没有名称,但是它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常的列表
- 概念:
- 匿名:是因为它不想普通方法那样有一个明确的名称
- 函数:是因为lambda函数不想方法那样属于某个特定的类,但是和方法一样,lambda有参数列表,函数主体,返回类型,还可能有可以抛出的异常列表
- 传递:lambda表达式可以作为参数传递给方法或者存储在变量中
- 简洁:无需向匿名类那样写很多模板代替代码
- 函数式接口:就是仅仅声明了一个抽象方法的接口
- 函数描述符:函数式接口的抽象方法的签名基本上就是lambda表达式的签名,我们将这种抽象方法叫做函数描述符
为什么要使用lambda表达式?
- 代码的传递过程过于繁琐(行为初始化的代码编码过程过于繁琐)
lambda表达式有什么好处?
- 可以简洁地传递代码
lambda表达式的使用要求?
- lambda表达式只有在接受函数式接口的地方才能使用
- 函数式接口:就是仅仅声明了一个抽象方法的接口
- lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实现
- Java8自带的函数式接口。包:java.util.function包中,包括Predicate,Function<T,R>,Supplier,Consumer和BinaryOperator
lambda表达式的使用方式?
- 实例:环绕执行模式
//模板代码
public static String processFile() throw IOException{
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return br.readLine();
}
}
// 改造
// 行为参数化(行为代码)
String result = processFile((BufferedReader br-> br.readLine()+br.readLinr()));
//传递(函数式接口作为参数传递)
//函数式接口
@FunctionInterface
public interface BufferedReaderProcesser{
String process(BufferedReader b) throws IOException;
}
public static String processFile(BufferedReaderProcesser p) throws IOException{
...
}
// 执行行为
public static String processFile(BufferedReaderProcesser p)throws IOException{
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return p.process(br);
}
}
//传递
String oneLine = processFile((BufferedReader br)->br.readLine());