什么是Java 的 Lambda 表达式?

一、前言

在Lambda表达式没有出现之前,很多功能的实现需要写冗长的匿名类,这样的代码不仅难以维护,还让人难以理解,用 Lambda 表达式后,代码变得更加简洁,易于维护。今天我们就来聊聊Lambda表达式的一些使用。

二、Lambda表达式的使用

我们之前的编程习惯是利用匿名类去实现一些接口的行为,比如线程的执行,然而,这种写法会导致代码膨胀和冗长,我们先来看看传统的写法:

java 复制代码
public static void main(String[] args) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("hello world");
        }
    });
    thread.start();
}
  1. Thread thread = new Thread(new Runnable() {...}); 这一行创建了一个新的线程,它接受一个 Runnable 类型的对象作为参数,这里使用的是匿名类。

其实上面那段代码是非常冗长的,我们直接来对比一下Lambda表达式的写法就知道了:

java 复制代码
    public static void main(String[] args) {
        //使用Lambda表达式
        Thread thread = new Thread(() -> System.out.println("hello world"));
        thread.start();
    }

简洁明了,只用一行简洁的代码,我们就完成了线程的创建和启动。我们来看一下Lambda表达式的标准格式:

java 复制代码
(parameters) -> expression

说明:

  • (parameters) 是传递给 Lambda 表达式的参数,可以是零个或多个。例如,在我们上面的例子中传递的是 () ->,表示没有参数。
  • -> 是箭头操作符,表示 Lambda 表达式的开始,指向 Lambda 体。
  • expression 是 Lambda 表达式的主体,也就是我们要执行的代码。

使用前提

上文中提到,lambda表达式可以在⼀定程度上简化接口的实现。但是,并不是所有的接口都可以使用lambda表达式来简化接口的实现的。

先说结论,lambda表达式,只能实现函数式接口。lambda表达式毕竟只是⼀个匿名方法。

什么是函数式接口?

函数式接口在 Java 中是指: 有且仅有一个抽象方法的接口 。 函数式接口,即适用于函数式编程场景的接口。而 Java 中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的 Lambda才能顺利地进行推导。

Java 8 中专门为函数式接口引入了一个新的注解:@FunctionalInterface。一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口。以下为示例代码:

java 复制代码
@FunctionalInterface
public interface TestFunctionalInterface {
    void testMethod();
}

语法简化

1.参数类型简化:由于在接口的方法中,已经定义了每⼀个参数的类型是什么。而且在使用lambda表达式实现接口的时候,必须要保证参数的数量和类 型需要和接口中的方法保持⼀致。因此,此时lambda表达式中的参数的类型可以省略不写。例子:

java 复制代码
Test test = (name,age)  -> {
    System.out.println(name+" "+age);
};

2.参数小括号简化:如果方法的参数列表中的参数数量 有且只有⼀个,此时,参数列表的小括号是可以省略不写的。例子:

java 复制代码
Test test = name -> {
    System.out.println(name);
};

3.方法体部分的简化:当⼀个方法体中的逻辑,有且只有⼀句的情况下,大括号可以省略。例子:

java 复制代码
Test test = name -> System.out.println(name);

4.return部分的简化:如果⼀个方法中唯⼀的⼀条语句是⼀个返回语句, 此时在省略掉大括号的同时, 也必须省略掉return。例子:

java 复制代码
Test test = (a,b) -> a+b;

三、总结

本文从Lambda表达式的基础概念、基本使用几方面完整的讨论了这一Java8新增的特性,实际开发中确实为我们提供了许多便利,简化了代码。

相关推荐
时艰.7 小时前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
Honmaple7 小时前
QMD (Quarto Markdown) 搭建与使用指南
后端
丶小鱼丶7 小时前
并发编程之【优雅地结束线程的执行】
java
市场部需要一个软件开发岗位8 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿8 小时前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD0018 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东8 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology8 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble8 小时前
springboot的核心实现机制原理
java·spring boot·后端
人道领域8 小时前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言