Lamda表达式:
λ希腊字母表中排序第11位的字母,英文名称为Lambda,它Lambda表达式是Java SE 8中一个重要的新特性,允许通过表达式来代替功能接口,它与其他方法相同,提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块),实际上是属于函数式编程的概念:
语法如下:
(参数) ->表达式 或 (参数) ->{ 语句; }
Lambda表达式允许你直接把一个代码块赋值给一个变量
无参有返回值Lambda表达式:
() -> 2 //该Lambda表达式表示返回值为2
有参有返回值Lambda表达式:
一个参数:
x -> 2 * x //x为参数,返回2*x的值
2个参数:
(x, y) -> x + y //x,y均为参数,返回两者的和
有参无返回值Lambda表达式:
(String s) -> System.out.print(s) //s为参数,将其输出
为什么要使用lambda表达式?
避免匿名内部类定义过多 可以让代码看起来很简洁 去掉了大量没有意义的代码,只留下核心的逻辑
在讲如何使用Lamda表达式之前,我们先来学习一下FunctionalInterface (函数式接口)
函数式接口:
任何接口,如果只包含唯一一个抽象方法
,那么它就是一个函数式接口,对于函数式接口,我们可以通过lambda表达式来创建该接口的对象
举例:
//定义函数式接口 interface mylike{ void lambda(); }
JDK1.8新特性,default默认方法可以有具体的实现:
//定义函数式接口 interface mylike{ void lambda(); default void test2() { System.out.println("我是default默认方法可以有具体的实现"); } }
Lambda表达式的推导:
定义函数式接口:
package Lambda; public interface fun_interface { void show(); }
匿名函数的语法:
new 接口/类名(参数1, 参数2...){ 实现方法1(){ } 实现方法2(){ } ...... };
匿名函数的方法是:返回值 方法名 参数列表 方法体,我们只需要关心参数列表 方法体,而不用关心方法名和返回值
使用匿名内部类实现该函数式接口:
package Lambda; public class fun_test1 { public static void main(String[] args) { fun_interface fun_interface=new fun_interface() { @Override public void show() { System.out.println("重写函数式接口中的方法"); } }; fun_interface.show(); } }
在上述代码中,我们没有创建实现类[fun_test1]的实例化对象就实现了具体的show()方法,通常,我们也习惯用匿名内部类的方式创建并启动线程
但是上面的代码还是略显麻烦
Lambda表达式的写法:
package Lambda; public class lambda_test { public static void main(String[] args) { fun_interface fun_interface=()->System.out.println("重写函数式接口中的方法"); fun_interface.show(); } }
无论是匿名内部类还是Lambda表达式都可以正确实现这个接口,但使用匿名内部类,我们会发现在代码量上减少了许多,但其实Lambda表达式的本质就是一个匿名内部类
使用Lambda表达式的前提是:接口为函数式接口
函数式接口的不同类型:
package Lambda; public class fun_test3 { //无返回值无参数 interface NoParameterNoReturn { void test(); } //无返回值一个参数 interface OneParameterNoReturn { void test(int a); } //无返回值多个参数 interface MoreParameterNoReturn { void test(int a,int b); } //有返回值无参数 interface NoParameterReturn { int test(); } //有返回值一个参数 interface OneParameterReturn { int test(int a); } //有返回值多参数 interface MoreParameterReturn { int test(int a,int b); } }
Lambda表达式与函数式接口的简单应用:
package Lambda; public class fun_lambda { public static void main(String[] args) { //无返回值无参数 NoParameterNoReturn parameterNoReturn=()-> System.out.println("这里是重写后的方法"); parameterNoReturn.test(); //无返回值一个参数 //写法1 OneParameterNoReturn oneParameterNoReturn=(a)->{System.out.println(a);}; oneParameterNoReturn.test(99); //写法2 OneParameterNoReturn oneParameterNoReturn1=a->System.out.println(a); //只有一个参数,小括号可以省略;只有一条语句,花括号可以省略 oneParameterNoReturn1.test(99); //无返回值多个参数 MoreParameterNoReturn moreParameterNoReturn=(a,b)->{System.out.println(a+b);}; moreParameterNoReturn.test(99,1); //有返回值无参数 NoParameterReturn noParameterReturn=()->{return 520;}; int ret=noParameterReturn.test(); System.out.println(ret); //有返回值一个参数 OneParameterReturn oneParameterReturn=(a)->{return a+1;}; int ret1=oneParameterReturn.test(99); System.out.println(ret1); //有返回值多参数 MoreParameterReturn moreParameterReturn=(a,b)->a*b;//相当于(a+b)->{return a*b;} int ret2=moreParameterReturn.test(4,8); System.out.println(ret2); } } interface NoParameterNoReturn { void test(); } //无返回值一个参数 interface OneParameterNoReturn { void test(int a); } //无返回值多个参数 interface MoreParameterNoReturn { void test(int a,int b); } //有返回值无参数 interface NoParameterReturn { int test(); } //有返回值一个参数 interface OneParameterReturn { int test(int a); } //有返回值多参数 interface MoreParameterReturn { int test(int a,int b); }
输出:
这里是重写后的方法 99 99 100 520 100 32
注:
参数类型可以省略,如果需要省略,每个参数的类型都要省略。 参数的小括号里面只有一个参数,那么小括号可以省略 如果方法体当中只有一句代码,那么大括号可以省略 如果方法体中只有一条语句,其是return语句,那么大括号可以省略,且去掉return关键字
Lambda表达式的优缺点:
优点:
在代码层次上来说,使代码变得非常的简洁,开发迅速 方便函数式编程 非常容易进行并行计算 Java 引入 Lambda,改善了集合操作
缺点:
代码可读性变差 在非并行计算中,很多计算未必有传统的 for 性能要高 不容易进行调