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

相关推荐
Victor3567 分钟前
MongoDB(24)如何对查询结果进行排序?
后端
怕浪猫24 分钟前
第21章:微服务与分布式架构中的Go应用
后端·go·编程语言
武子康37 分钟前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
摸鱼的春哥1 小时前
Agent教程15:认识LangChain(中),状态机思维
前端·javascript·后端
Seven971 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
风象南8 小时前
我把大脑开源给了AI
人工智能·后端
橙序员小站12 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德13 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆14 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
开心就好202515 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios