首先我们要知道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表达式来使其得到不同的结果。