首先我们要知道Lambda表达式是jdk8 的一个重要特性,Lambda允许把函数作为一个方法的参数。(函数作为参数传递进方法)。
它最大的优点是使我们的代码更加紧凑和简洁。

特性

1.不需要声明参数类型(编译器统一识别参数值)。注意:当我们传入多个参数时,我们可以全部忽略参数类型,也可以全部加上参数类型,不能仅仅忽略部分参数类型。
2.对于()括号如果仅有一个值传入可以不写;多个需要。
3.对于{}如果仅有一条执行语句可以不写;多个需要。
4.对于{},如果有则必须要写返回值。

Lambda的简单例子

// 1. 不需要参数,返回值为1 
() -> 1
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回x-y的差  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回x+y的和
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

如何嵌入代码

在我们使用它们之前我们得了解:
编译器使用以下规则来确定lambda表达式是否可分配给其目标类型:
它必须是一个函数接口。
lambda表达式的参数必须与函数接口中的抽象方法匹配。
lambda表达式的返回类型与函数接口中抽象方法的返回类型兼容。
从lambda表达式抛出的检查异常必须与函数接口中抽象方法的已声明的throws子句兼容。
我们先定义个接口:

interface W{
	public int w();
}

随后我们来写一下

public class LambdaTest {
	public static void main(String[] args) {
		W x = ()->2;
		System.out.println(x.w());
	}
}

返回值是2,这样是不是就会很方便。
同样的如果我们传一个有参的值:
注意:因为它的特性我们可以去掉()和参数类型,仅仅去掉参数类型也可以,但是不可以去掉了括号但保留参数类型。

public class LambdaTest {
	public static void main(String[] args) {
		//W x = (int a)->2*a;
		W x = a->2*a;
		System.out.println(x.w(2));
	}
}

此时我们的接口中应当做出改变:

interface W{
	public int w(int a);
}

输出结果是4.

同理我们也可以做多个参数的情况,但是我们要注意我们必须要有()了,为了方便书写,我直接把必须需要大括号的方式写出来。

public static void main(String[] args) {
		W x = (a,b)->{
			int c =a+b;
			return c;};
		System.out.println(x.w2(2,2));
	}
}
interface W{
	public int w2(int a,int b);
}

如上述代码,当我们的语句有多条时候必须要使用{}来包裹它们。

其实单到这里,还有部分人不知道如何使用,让我们再来看最后一个例子:

package test;

public class LambdaTest {
	public static void main(String[] args) {
		w((x,y)->x+y);
		w((x,y)->x-y);
		w((x,y)->x*y);
		w((x,y)->x/y);
		//System.out.println();
	}
	private static void w(C c){
		int x = 1, y = 2;
		int result = c.show(x,y);
		System.out.println(result);
	}
}
interface C{
	int show(int x, int y);
}

当我们需要传入一个接口类型的参数时,我们可以通过传入不同的Lambda表达式来使其得到不同的结果。