Lambda表达式是Java 8 的新特性,即为匿名函数,可以表示闭包(文末有补充解释),使用它可以让代码更加简洁,但相对的代码可读性降低了……
Lambda表达式
1、基本语法
expression =(variable) -> action
//或
expression =(variable) ->{action; }
语法说明:
- 可选类型声明:
不需要声明参数类型,编译器可以统一识别参数值 - 可选的参数圆括号:
一个参数无需定义圆括号,但多个参数需要定义圆括号 - 可选的大括号:
如果主体包含了一个语句,就不需要使用大括号 - 可选的返回关键字:
如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值
示例:
// 1. 不需要参数,返回值为 5
int i=()->5
// 2. 接收一个参数(数字类型),返回其2倍的值
int i=x ->2* x
// 3. 接受2个参数(数字),并返回他们的差值
int i=(x, y)-> x – y
// 4. 接收2个int型整数,返回他们的和
int i=(int x,int y)-> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s)->System.out.print(s)
2、函数式接口
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
函数式接口:只定义一个抽象方法的接口
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例
示例:
//Lambda表达式
Runnable r2 = ()-> System.out.println("hello");
//匿名内部类
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
};
Lambda表达式应用
环绕执行模式
利用Lambda表达式,将行为参数化,使代码更加灵活。
现在有一个读取文件的方法:
public static String processFile() throws IOException {
try(BufferedReader br = new BufferedReader(newFileReader("data.txt"))){
return br.readLine();
}
}
这个方法的局限在于,只能固定读取一行,当你想读取更多行时,就需要新增方法。
将行为参数化,使用函数式接口,利用Lambda表达式,就可以实现按需读取:
1、定义函数式接口
@FunctionalInterface
publicinterfaceBufferedReaderProcessor{
String process(BufferedReader br)throws IOException;
}
2、修改原方法
public static String processFile(BufferedReaderProcessor processor) throws IOException {
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return processor.process(br);
}
}
3、使用Lambda表达式
/处理一行
String result1 = processFile((BufferedReader br) -> br.readLine());
//处理二行
String result2 = processFile((BufferedReader br) -> br.readLine()+br.readLine());
总结
Lambda表达式虽然可以让代码更加简练,但是如果读代码的人功力不够的话,确实会降低代码的易读性,所以是否使用还要根据实际情况,当然我们还是非常有必要了解一Lambda表达式。
补充
闭包
- 闭包就是能够读取其他函数内部变量的函数。
- 闭包可以理解成“定义在一个函数内部的函数。
- 在本质上,闭包是将函数内部和函数外部连接起来的桥梁。