packagecom.xct.test;//学习lambda表达式publicclassLambda{//2.静态内部类staticclass ASX2 implementsILike{@Overridepublicvoidlike(){System.out.println("i like 1ambda2");}}publicstaticvoidmain(String[] args){//3.局部内部类class ASX3 implementsILike{@Overridepublicvoidlike(){System.out.println("i like 1ambda3");}}//用函数式接口创建子类对象ILike a1 =newASX();
a1.like();
a1 =newASX2();
a1.like();
a1 =newASX3();
a1.like();//4.匿名内部类
a1 =newILike(){@Overridepublicvoidlike(){System.out.println("i like lambda4");}};
a1.like();//5.Lambda表达式
a1 =()->{System.out.println("i like lambda5");};
a1.like();}}//函数式接口@FunctionalInterfaceinterfaceILike{voidlike();}//1.实现接口class ASX implementsILike{@Overridepublicvoidlike(){System.out.println("i like 1ambda1");}}
示例:使用Lambda表达式创建线程
packagecom.xct.test;//使用Lambda表达式创建线程publicclassLambda3{publicstaticvoidmain(String[] args){newThread(()->{System.out.println(Thread.currentThread().getName());}).start();Runnable r =()->{System.out.println(Thread.currentThread().getName());};
r.run();}}
示例:练习Lambda表达式带参数
packagecom.xct.test;//练习lambda表达式带参数publicclassLambda2{publicstaticvoidmain(String[] args){ILove l =null;//lambda表达式
l =(a,b)->{System.out.println("a"+a+",b"+b);return1;};
l.love(404,200);}}//函数式接口@FunctionalInterfaceinterfaceILove{intlove(int a,int b);}
注意:Lambda表达式中的闭包问题
示例:查看Lambda表达式中的闭包问题
packagecom.xct.test;//Lambda表达式中的闭包问题publicclassLambda4{publicstaticvoidmain(String[] args){int num =20;IPackgeOver iPackgeOver;
iPackgeOver =(a,b)->{System.out.println(a+b);System.out.println(num);};// num = num+2;
iPackgeOver.getSun(10,20);}}//函数式接口@FunctionalInterfaceinterfaceIPackgeOver{voidgetSun(int a,int b);}
如图所示:
这个问题我们在匿名内部类中也会存在,如果我们把注释放开会报错,告诉我 num 值是 final 不能被改变。这里我们虽然没有标识 num 类型为 final,但是在编译期间虚拟机会帮我们加上 final 修饰关键字。