Lambda表达式
Lambda表达式概述
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
lamda表达式又称为函数式编程。
如y=kx+1;f(x)=kx+1;这是数学中的函数,给定一个x,就能得到一个y的值
Lambda表达式又是面向接口的,面向接口编程。要想面向函数编程,按照面向接口的原则,就要定义一种函数式接口。
Lambda表达式语法
使用匿名内部类实现一个接口
(parameters) -> expression
或
(parameters) ->{
statements; }
Lambda表达式案例
interface Fooi{
public void sayHello();
}
public class LambdaTest {
public static void main(String[] args) {
//接口不能new,使用匿名内部类
Fooi foo = new Fooi(){
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello 2004");
}
};
foo.sayHello();
}
}
这里程序本来只有一行,但是写了这么多。降低了程序开发的效率。
如何能够优化呢?
Lambda表达式就是解决了匿名内部类代码冗余的现象
我们可以看到,这个接口只有一个方法,当我们想要实现这个接口时,实现的方法也只有1个。即不用指定就知道是哪一个方法了。
Lambda表达式口诀:拷贝小括号,写死右箭头,落地大括号
interface Fooi{
public void sayHello();
}
public class LambdaTest {
public static void main(String[] args) {
Fooi foo=() -> {
System.out.println("hello 1205");};
foo.sayHello();
}
}
后面代码只有两行。明显的提高了开发的效率
如果现在有多个方法呢,还能使用吗?
interface Fooi{
public void sayHello();
public int add(int x,int y);
}
public class LambdaTest {
public static void main(String[] args) {
Fooi foo=()->{
System.out.println("hello 1205");};
foo.sayHello();
}
}
此时程序报错:
可见,函数式接口中只能实现一个方法才能使用Lambda表达式
如果有参数有返回值可使用吗?
interface Fooi{
public int add(int x,int y);
}
public class LambdaTest {
public static void main(String[] args) {
Fooi foo=(int x,int y)->{
return x+y;
};
System.out.println(foo.add(3,5));
}
}
由此可见,方法有参数有返回值也可以使用Lambda表达式
如何保证接口是函数式接口呢?
使用@FunctionalInterface注解
给接口加上两个方法,就会报错。如图所示:
@FunctionalInterface;
interface Fooi{
public int add(int x,int y);
public void sale();
}
此时会报错。
如果一个接口里面有且仅有一个未实现的方法,但没有加上这个注解,java里面会隐式的为这个接口加上这个注解
如果一个接口里面有两个方法,并且定义了FunctionalInterface注解,就会报异常
Lambda表达式总结
Lambda表达式口诀:拷贝小括号,写死右箭头,落地大括号
@FunctionalInterface注解的使用