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

相关推荐
壹米饭17 小时前
MYSQL进阶:删除视图时视图被lock解决方案
后端·mysql
CV工程师的自我修养17 小时前
还不知道线程池如何使用?看懂这篇就可以创建合理稳定的线程池
后端·架构
悦悦妍妍17 小时前
spring-ioc
java
优弧17 小时前
Claude 终于对普通人下手了!Cowork 发布,你的最强 AI 打工搭子来了!
前端·后端
佛系打工仔17 小时前
绘制K线第一章:可见区间处理
java
wangkay8817 小时前
【Java 转运营】Day02:抖音直播间流量底层逻辑全解析
java·新媒体运营
我是谁的程序员17 小时前
有没有在 iOS 直接抓包 的App?
后端
5***b9717 小时前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端
无限大618 小时前
为什么"算法推荐"这么准?——从协同过滤到深度学习
后端
AIGCExplore18 小时前
Jenkins 全局配置及工具验证教程
java·servlet·jenkins