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

相关推荐
毕设源码-朱学姐15 分钟前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
C雨后彩虹2 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
java1234_小锋3 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
2501_944525543 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
计算机学姐3 小时前
基于SpringBoot的电影点评交流平台【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·spring·信息可视化·echarts·推荐算法
Filotimo_3 小时前
Tomcat的概念
java·tomcat
索荣荣4 小时前
Java Session 全面指南:原理、应用与实践(含 Spring Boot 实战)
java·spring boot·后端
Amumu121384 小时前
Vue Router(二)
java·前端
念越4 小时前
数据结构:栈堆
java·开发语言·数据结构