Java8的lambda表达式入门

我也是个小白,各位倘若看到一定要带思考去看。

 

一、背景

lambda表达式使用的前提:函数式接口的实现,格式大致为

(形参列表)->{实现代码}

1.用于接口的实现

2.接口中只有一个方法

@FunctionalInterface 注解用于标记这是一个函数式接口

 

二、应用过程

1.在一开始我们书写了一个函数式接口Watch

 

 2.接口的一个实现类Book

 

 3.通常情况下,我们通过实现类运行该方法。

 

4.注释掉步骤3的方法,改用匿名内部类的方式书写。

 

运行结果如下:

 

 

 5.此时提醒我们可以采用lambda方式来书写代码

 

点击后即为下面的形式:

 

 

三、书写lambda表达式

1.复制上面的匿名内部类代码

new WacthSome(){
@Override
public void wacthSth() {
System.out.println("now : watch noName");
}
}
.wacthSth();

对比lambda代码

( (WacthSome) () -> System.out.println("now : watch noName") )
.wacthSth();

可以看到,在lambda表达式中保留了形参列表部分和方法体部分,对于无关紧要的代码则做了省略。

如果接口中有多个方法,按照这种省略的格式是无法指明对哪个方法进行了重写,这就是为什么要强调函数式接口的原因。

我们目前可以理解为lambda对类似于匿名内部类方式创建对象的简化 (这是个人理解,后面还写到可以接收函数的返回值)。

既然要创建对象,那么就需要知道所创建对象的类型,此处即为绿色部分的(WacthSome)。

 

现在我们尝试开始自己书写这个接口对应的lambda表达式。

目前我们关注的点有3个:类型、形参、方法体

A.类型:lambda实现哪个接口?(文末对此有更多分析)

B.形参:函数式接口中对应方法的形参列表

C.方法体:...

 

 2.更改接口中的函数的形参

  可以看到所写的lambda报错。

 

 变更所写的lambda,改变()中的内容,程序即可正常运行。

 

 其中()即为形参列表,是可以省略变量类型的,但注意要省略都得省略。

当然作为形参,名字是可以不同的,此处注意方法的重写(返回类型、形参顺序、形参类型)。

 

3.为函数添加返回值

  可以看到所写的lambad再次报错

 

 我们在方法体中添加一个符合类型的返回值,表达式再次变为正确。

 

 我们可以接收并输出这个方法的计算结果,可以看到成功显示。

 

四、进阶

lambda可以快速实现一个函数式接口,Runnable接口就是一个很好的例子。

 

 编写相关代码

 

 其中的r是可以替换的,直接简写为。

 

五、其他

1.在上文中,我们在使用lambda表达式时,(类型)好像时有时无?

位置不一样

A.情景一

( (WacthSome) () -> System.out.println("now : watch noName") )

.wacthSth();

在方法体中,通过lombda表达式()->得到了一个实例(或者带返回值/这个实例调用方法产生了个返回值)。

但是你并不知道这个实例它究竟是谁,所以需要显式声明类型。

 

B.情景二

new Thread(

() -> {System.out.println("run方法222...");

}).start();

这个位置是在形参(Thread的构造函数)中,是默认有类型的。

在new Thread()的括号中按下ctrl+p可以看到需要的参数列表。

 

 

 

 

 
原文地址:https://www.cnblogs.com/yang37/p/12683382.html