Lambda表达式可以看成是匿名内部类,使用Lambda表达式时,接口必须是函数式接口。
函数式接口在Java中是指: 有且仅有一个抽象方法的接口(接口中抽象方法的public abstract
是可以省略的)
基本语法:
<函数式接口> <变量名> = (参数1,参数2...) -> { //方法体 }
说明:
(参数1,参数2…)表示参数列表;->表示连接符;{ }内部是方法体
1、=右边的类型会根据左边的函数式接口类型自动推断;
2、如果参数列表为空,只需保留();
3、如果参数只有1个,()可以省略,只需要参数的名称即可;
4、如果执行语句只有1句,且无返回值,{ }可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
5、参数列表的数据类型会自动推断;
6、lambda不会生成一个单独的内部类文件;
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后在修改该局部变量,会报错;
示例代码:
public interface LambdaTest { abstract void print(); } public interface LambdaTest2 { abstract void print(String a); } public interface DefalutTest { static int a =5; default void defaultMethod(){ System.out.println("DefalutTest defalut 方法"); }
int sub(int a,int b);
static void staticMethod() { System.out.println("DefalutTest static 方法"); } } public class Main { public static void main(String[] args) { //匿名内部类--java8之前的实现方式 DefalutTest dt = new DefalutTest(){ @Override public int sub(int a, int b) { // TODO Auto-generated method stub return a-b; } }; //lambda表达式--实现方式1 DefalutTest dt2 =(a,b)->{ return a-b; }; System.out.println(dt2.sub(2, 1)); //lambda表达式--实现方式2,省略花括号 DefalutTest dt3 =(a,b)->a-b; System.out.println(dt3.sub(5, 6)); //测试final int c = 5; DefalutTest dt4 =(a,b)->a-c; System.out.println(dt4.sub(5, 6)); //无参方法,并且执行语句只有1条 LambdaTest lt = ()-> System.out.println("测试无参"); lt.print(); //只有一个参数方法 LambdaTest2 lt1 = s-> System.out.println(s); lt1.print("有一个参数"); } }
局部变量修改报错如图:
原文:https://www.cnblogs.com/wffzk/p/14839301.html