概述
现在,很多同学已经接受并熟悉了 Java 的 Lamda 写法,但可能有些同学还是一头雾水。
这里,我抛砖引玉,来对 Java Lamda 写法做一个简单的介绍:
-
首先 Lamda 写法的固定格式为:参数 -> 语句块
-
另外 Lamda 语法是出现在Java8及其以后的,Java8以前是不涉及的,所以JDK1.7及其以前版本这种写法编译是会被报错的。
优势
那么Lamda 写法有哪些优势呢?
-
首先,他简化了代码,将以前很多行的代码简化为几行或者一行,使得代码看上去更加的简介;
-
另外,Lamda 算法对并行运算非常具有优势,某些实现用 Lamda 方式会更加高效。
示例
如果一个接口只有一个实现方法,我们称这种接口叫做函数式接口。
那么我们通常会以匿名内部类的方式去实现。
比如:我们常用的多线程去异步实现某个功能的时候,常常会使用如下方式:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("异步功能实现");
}
}).start();
这里的 Runable 接口就一个run() 实现方法,源码如下图:
那么这种条件下,就可以简化为 Lamda 写法,具体效果如下:
new Thread(() -> System.out.println("异步实现功能")).start();
我们可以看见:Lamda 写法的代码量已经浓缩为了一行,确实简洁了不少。
释义
那么如何理解上面这句 Lamda 写法呢?
(1)我们可以看到,变化的只是参数接口匿名实现类的写法,外面外并未有任何变化;
(2)由于 Thread 类里面就一个以接口为参数的方法,所以省去了接口名 Runable;
(3)由于 Ruanble 接口里面就一个 run() 方法定义,故而省去了方法名;
(4)由于 run() 方法定义里未有任何参数,故而 Lamda 写法就只有以一个 () 开头了;
(5) 中间的箭头 -> 是 Lamda 标识符,读作 “goes to”;
(6)箭头后面就是实现方式了,这个同以前代码实现。
拓展示例
示例1
那么,当一个接口的唯一方法涉及多个参数,此时 Lamda 写法又该怎么样呢?
我们不妨创建一个 MyService,里面包含一个带有参数的方法定义:
public interface MyService {
public void say(String name);
}
然后我们创建一个 Test 类,并在类里面添加一个该接口为参数的 test() 方法,以及主方法进行测试:
Java 8 以前的写法:
public class Test {
public static void main(String[] args){
test(new MyService() {
@Override
public void say(String name) {
System.out.println("hello : " + name);
}
});
}
public static void test(MyService service) {
service.say("jack");
}
}
程序运行结果为如下所示:
Java 8 Lamda 写法:
public class Test {
public static void main(String[] args){
test((name) -> System.out.println("hello : " + name));
}
public static void test(MyService service) {
service.say("jack");
}
}
运行结果,同样为:
经过上面两个例子,我们已经证实了,两种写法的运行效果完全是可以等价的,Lamda 写法看起来也更简洁。
另外,当参数只有一个的时候,参数的括号也可以省去不写,例如,上面的 Lamda 写法还可以进一步简写:
test(name -> System.out.println("hello : " + name));
同理,如果接口的方法有多个参数的时候,Lamda 参数括号里也需要传递多个参数。
示例2
我们将接口里面的 say(String name) 方法,增加一个参数 age,改为如下:
public interface MyService {
public void say(String name, int age);
}
那么对应的方法调用就成为了如下:
Java 8 前写法:
public class Test {
public static void main(String[] args){
test(new MyService() {
@Override
public void say(String name, int age) {
System.out.println("hello : " + name + ", I am " + age);
}
});
}
public static void test(MyService service) {
service.say("jack", 28);
}
}
Java 8 Lamda 写法:
public class Test {
public static void main(String[] args){
test((name, age) -> System.out.println("hello : " + name + ", I am " + age));
#### 线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识
![](https://img-blog.csdnimg.cn/img_convert/eb5538d6d8b1708362508f85190850f3.webp?x-oss-process=image/format,png)
#### 一线互联网P7面试集锦+各种大厂面试集锦
![](https://img-blog.csdnimg.cn/img_convert/4ffe930d733db065266ac12285cff88a.webp?x-oss-process=image/format,png)
#### 学习笔记以及面试真题解析
![](https://img-blog.csdnimg.cn/img_convert/9516f023501b1eae7f1dc7caf750d4ed.webp?x-oss-process=image/format,png)
public class Test {
public static void main(String[] args){
test((name, age) -> System.out.println("hello : " + name + ", I am " + age));
#### 线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识
[外链图片转存中...(img-joAeUkoj-1718872340641)]
#### 一线互联网P7面试集锦+各种大厂面试集锦
[外链图片转存中...(img-f0Mcb7No-1718872340642)]
#### 学习笔记以及面试真题解析
[外链图片转存中...(img-ukGs0RLI-1718872340642)]