一看就懂:Java 之 Lamda 写法

概述

现在,很多同学已经接受并熟悉了 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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值