Lambda表达式是Java 8 的新特性,即为匿名函数,可以表示闭包(文末有补充解释),使用它可以让代码更加简洁,但相对的代码可读性降低了……
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)
@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表达式,将行为参数化,使代码更加灵活。
现在有一个读取文件的方法:
public static String processFile() throws IOException {
try(BufferedReader br = new BufferedReader(newFileReader("data.txt"))){
return br.readLine();
}
}
这个方法的局限在于,只能固定读取一行,当你想读取更多行时,就需要新增方法。
将行为参数化,使用函数式接口,利用Lambda表达式,就可以实现按需读取:
@FunctionalInterface
publicinterfaceBufferedReaderProcessor{
String process(BufferedReader br)throws IOException;
}
public static String processFile(BufferedReaderProcessor processor) throws IOException {
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return processor.process(br);
}
}
/处理一行
String result1 = processFile((BufferedReader br) -> br.readLine());
//处理二行
String result2 = processFile((BufferedReader br) -> br.readLine()+br.readLine());
Lambda表达式虽然可以让代码更加简练,但是如果读代码的人功力不够的话,确实会降低代码的易读性,所以是否使用还要根据实际情况,当然我们还是非常有必要了解一Lambda表达式。
闭包
原文:https://www.cnblogs.com/z-coding/p/14921215.html