Java中lambda表达式快捷键_快速掌握Java中Lambda表达式
的⽤法
Lambda表达式的作⽤:
Lambda表达式的作⽤就是简化代码开发,让代码看起来更加简介。它是⽤来简化匿名内部类的。但是并不是所有的匿名内部类都能⽤Lambda表达式简化,Lambda表达式是有使⽤前提的。
Lambda表达式的使⽤前提:
1、⽤Lambda表达式简化的这个匿名内部类必须是某⼀个接⼝的实现类,且这个实现的接⼝中有且只有⼀个抽象⽅法;因为只有这
样,Lambda才能够根据接⼝中的上下⽂(代码)来推断出你简化的地⽅是什么内容,下⾯就来实际演⽰⼀下。(注:有且只有⼀个抽象⽅法的接⼝称为“函数式接⼝”)
2、使⽤Lambda表达式的地⽅必须具有上下⽂推断,就是在使⽤Lambda表达式的地⽅知道能够通过代码上下⽂推断出所需要的信息,因为Lambda表达式简化匿名内部类是不会写出匿名内部类实现所实现的接⼝,所以需要在能够推测出接⼝的地⽅使⽤(有点抽象,可以通过下⾯的案例来理解)。
Lambda表达式的格式:
Lambda表达式主要由三部分构成:()->{ }
1、开头⼩括号开始 ( ) :⼩括号中填写的是重写接⼝中的⽅法时,⽅法的参数。若⽅法⽆参数,则⼩括号空着,若有多个参数,则参数间⽤逗号隔开(与普通Java⽅法相同)
2、中间⼀个箭头 ->:可以理解为将参数传⼊到⽅法体中;
3、末尾⼀个⼤括号{ }:⼤括号中的内容就是⽅法体,也就是⽅法的逻辑代码;
当然,上⾯的结构是标准结构,但却不是绝对的,在某些情况下,部分内容可以省略,在下⾯的案例中将进⾏详细讲解。
Lambda使⽤案例:
案例⼀:Lambda表达式简化匿名内部类,重写⽆参数⽆返回值⽅法
⾸先,我们创建⼀个接⼝,⽤来测试Lambda表达式。通过Lambda表达式的使⽤前提可知,这个接⼝应当有且只有⼀个抽象⽅法。接⼝名字叫Test,⽅法叫display():
1 public interfaceTest {2
3 public abstract voiddisplay();4
5 }
然后,我们创建⼀个类,这个类中有⼀个⽅法useDisplay(Test t),它唯⼀的参数就是上⾯定义的接⼝Test。我们知道,当要调⽤这个⽅法时,应当传⼊⼀个Test接⼝的实现类,⽅法代码如下:
1 public static voiduseDisplay(Test t) {
2 //⽅法的内容就是调⽤接⼝中的display⽅法
3 t.display();
4 }
接下来,我们调⽤这个⽅法,分别采⽤匿名内部类以及Lambda表达式两种⽅式,以此来进⾏对⽐:
1 //调⽤⽅法,接⼝参数使⽤匿名内部类当场实现
2 useDisplay(
3 newTest() {
4 //重写接⼝中的⽅法,输出⼀句话
5 @Override
6 public voiddisplay() {
7 System.out.println("Lambda表达式案例⼀");
8 }
9 }10 );
上⾯的代码调⽤了useDisplay(Test t)⽅法,并在括号中使⽤匿名内部类实现了Test接⼝以及重写了Test的⽅法,将匿名内部类作为参数传递。这是匿名内部类的⽅式,那下⾯看看Lambda表达式时怎么去写的:
1 useDisplay(
2 //使⽤Lambda实现
3 ()->{
4 System.out.println("Lambda表达式案例⼀");
5 }
6 );
可以看到,代码明显精简了许多,我们来仔细看看究竟做了哪些改变:我们省略new,也省略了接⼝的名字,直接重写接⼝中的⽅法。为什么可以这么做呢,这就关系到我们之前所说的Lambda使⽤前提2:使⽤Lambda表达式的地⽅必须具有上下⽂推断;Lambda知道useDisplay的参数是Test接⼝,所有Lambda知道这⾥应该实现的接⼝就是Test,不可能是其他的了,因此可以省略接⼝名。接下来省略了⽅法的public、返回值类型、⽅法名,这些Lambda也可以推断出来,因为已经确定了是Test接⼝,那⾃然也知道了这个接⼝中的⽅法display()的信息,所以统统可以省略,这也是Lambda表达式使⽤前提1的原因。
然⽽,上⾯的Lambda表达式只是标准格式,它还能够继续简化,上⾯的表达式简化后的如下:
1 useDisplay( ()->System.out.println("Lambda表达式案例⼀") /*此处原本有分号*/ );
可以看到,上⾯的Lambda表达式相对于之前,省略了⼤括号以及末尾的分号。只有在Lambda表达式的⽅法体,也就是⼤括号中只有⼀条语句时,才能够省略⼤括号,同时也要省略分号,两者要么⼀起省略,要么都不省略。
案例⼆:Lambda表达式简化匿名内部类,重写有参有返回值⽅法
同样是定义⼀个接⼝Calculator,⾥⾯只有⼀个抽象⽅法add(),计算两个整数的和:
1 public interfaceCalculator {2
3 public abstract int add(int a,intb);4
5 }
与上⼀个案例类似的结构,在另⼀个类中定义⼀个⽅法invokeAdd,⽅法的内容就是调⽤接⼝中的add⽅法,得到两个整数的和并输出:
1 public static void invokeAdd(int a,intb,Calculator cal) {
2 System.out.println(cal.add(a, b));
3 }
⾸先还是和第⼀个案例⼀样,我们使⽤匿名内部类的⽅式调⽤这个⽅法(这次我把代码写的紧凑⼀些,上⼀个案例代码都拉的很开,⽅便查看):
1 invokeAdd(10, 20, newCalculator() {
2 @Override
3 public int add(int a, intb) {
4 return a+b;
java上下文context5 }
6 });
上⾯代码很简单,传⼊两个要相加的整数10和20,以及⼀个匿名内部类对象实现,实现Calculator接⼝,重写接⼝中add⽅法,求两个整数的和。下⾯来看看Lambda表达式怎么写上⾯这个代码:
1 //使⽤Lambda表达式的⽅式代替匿名内部类实现
2 invokeAdd(10, 20, (int a,int b)->{
3 return a+b;
4 });
还是来看看改变了哪些内容:⾸先,这是⽐较标准的写法,与案例⼀相同,省略了接⼝,直接重写接⼝中的⽅法,然后省略了⽅法的名字类型等,只留下⼀个⼤括号,⾥⾯包含⽅法的参数,后⾯跟着⼀个箭头,指向了⽅法体,⽽⽅法体则未改变。但是,这并不是最简略的写法,看下⾯这种更加简洁的写法:
1 //上Lambda表达式的简化
2 invokeAdd(10, 20, (a,b) -> a+b );
可以看到,这时已经简化到只剩⼀句代码了,我们来仔细看看简化了哪些内容:⾸先,填写⽅法参数的⼩括号中,参数的类型省略了,还是和上⾯⼀样的原因,既然Lambda表达式已经知道了你实现的接⼝,就知道了接⼝中那唯⼀的⽅法,也就知道了⽅法中参数的类型,所以即使你省略,Lambda也能够根据上下⽂推测出来;其次,因为⽅法体中只有⼀句代码,所以可以省略⼤括号以及⽅法体中语句末尾的分号;除此之外,这是⼀个有返回值的⽅法,在⽅法体中只有⼀句代码的情况下,连return这个关
键字都能省略。(注意:⼤括号,逗号,return 关键字,要么⼀起省略,要么都不省略。)
最后再说⼀个可以简化Lambda表达式的情况,就是当接⼝中的⽅法只有⼀个参数时,连填写参数的⼩括号都可以省略,这⾥就不演⽰了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。