教你理解Lambda表达式

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表达式。

补充

闭包

  • 闭包就是能够读取其他函数内部变量的函数。
  • 闭包可以理解成“定义在一个函数内部的函数。
  • 在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
原文地址:https://www.cnblogs.com/z-coding/p/14921215.html