当前位置: 首页 > article >正文

【Java SE】lambda 表达式

lambda 表达式是 Java 8 引入的一种语法糖,用于简化函数式接口的书写。它体现了函数式编程的思想,让程序员更关注对数据的操作,而不是具体的对象。

函数式接口是指只包含一个抽象方法的接口。在 Java 中,可以使用 @FunctionalInterface 注解来标识这样的接口。不过,无论是否添加这个注解,只要接口中只有一个抽象方法,它就会被视为函数式接口。

基本格式

(参数列表) -> {代码}

lambda 表达式可以以更简洁的方式定义行为,特别是在处理集合和流时,能够提高代码的可读性和可维护性。通过使用 lambda 表达式,我们可以快速定义一次性的操作,而无需创建额外的类或实现接口,能够有效简化代码的冗余。

实际应用

现在我们来探讨一下 lambda 表达式是如何简化代码的实现过程的。假设存在一个 Message 接口,这个接口有一个 send 抽象方法,用于发送信息:

public interface Message {
    void send(String msg);
}

考虑到现实中有多种发送信息的方式,比如通过 email 或是 sms,因此,我们可以通过定义 Email 类和 SMS 类来实现不同的消息发送方式:

public class Email implements Message {
    @Override
    public void send(String msg) {
        System.out.println("This is an email. The message is : " + msg);
    }
}
public class SMS implements Message{
    @Override
    public void send(String msg) {
        System.out.println("This is an sms. The message is : " + msg);
    }
}

当我们需要使用不同方式发送消息时,就可以通过 new 不同的对象来实现:

public class Main {
    public static void main(String[] args) {
        Message message1 = new Email();
        sendMessage(message1);

        Message message2 = new SMS();
        sendMessage(message2);
    }
    static void sendMessage(Message message) {
        String msg = "hello world!";
        message.send(msg);
    }
}

按照传统的方法,我们可以正确地定义和实现接口。然而,每次需要以不同方式发送消息时,我们都要经过许多步骤。例如,使用电子邮件发送消息时,需要创建一个 Email 类,实现 send 方法,然后实例化 Email 对象,最后才能发送消息。这个过程可以通过使用匿名内部类来简化:

public class Main {
    public static void main(String[] args) {
        sendMessage(new Message() {
            @Override
            public void send(String msg) {
                System.out.println("This is xxx. The message is : " + msg);
            }
        });
    }
    static void sendMessage(Message message) {
        String msg = "hello world!";
        message.send(msg);
    }
}

虽然使用匿名内部类可以简化消息传递的定义,但实际步骤并没有减少,只是省去了命名的麻烦。那么,有没有更简单的实现方式?答案是可以使用 lambda 表达式:

public class Main {
    public static void main(String[] args) {
        sendMessage((String msg) -> {System.out.println("This is an lambda. The message is : " + msg);});
    }
    static void sendMessage(Message message) {
        String msg = "hello world!";
        message.send(msg);
    }
}

上述代码使用了 lambda 表达式,使得无需定义类和实例化对象。实际上,只需将匿名内部类的方法参数和函数体转换为 lambda 表达式的格式,就可以实现这种转换。Java 会根据 lambda 表达式自动覆盖相应的抽象方法,从而简化代码。当将 lambda 表达式赋值给函数式接口时,Java 就会利用它来实现接口。

省略规则

在书写 lambda 表达式时,可以通过以下规则化简 lambda 表达式的写法:

  • 参数类型可以省略
sendMessage((msg) -> {System.out.println("This is an lambda. The message is : " + msg);});
  • 方法体只有一句代码时,大括号、return 和代码的分号可以省略
sendMessage((msg) -> System.out.println("This is an lambda. The message is : " + msg));
  • 方法只有一个参数时小括号可以省略
sendMessage(msg -> System.out.println("This is an lambda. The message is : " + msg));

http://www.kler.cn/a/397529.html

相关文章:

  • go 集成swagger 在线接口文档
  • 【Linux:epoll】
  • A030-基于Spring boot的公司资产网站设计与实现
  • 软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型
  • Python调用API翻译Excel中的英语句子并回填数据
  • 利用python 检测当前目录下的所有PDF 并转化为png 格式
  • 15分钟学 Go 第 56 天:架构设计基本原则
  • 浪潮服务器(BMC)监控易监测指标解读
  • 4399 C++面试题及参考答案
  • IT行业现状与未来趋势
  • SOL链上Meme生态的崛起与未来#Dapp开发#链游#交易所#公链搭建
  • 和 Nostr 探索 Web5 的未来
  • 卓越API设计:简洁统一开放规范
  • 【学习心得】数据分析三剑客跟学Gitee仓库
  • C++知识点总结(57):STL综合
  • Ubuntu 的 ROS 操作系统 turtlebot3 gazebo仿真
  • 代码随想录算法训练营第四十八天|Day48 单调栈
  • 使用 PDF API 合并 PDF 文件
  • Vue 组件通信及进阶语法
  • 深入解析 OpenHarmony 构建系统-4-OHOSLoader类
  • HCIP-HarmonyOS Application Developer 习题(二十二)
  • 【鸿蒙开发】第十七章 Camera相机服务
  • 网络协议之TCP
  • RapidIO介绍
  • NX二次开发将刀轨转曲线
  • It’s All About Your Sketch: Democratising Sketch Control in Diffusion Models