什么是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新增的特性,实际开发中确实为我们提供了许多便利,简化了代码。

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm