Java8新特性之——Lambda表达式

news2024/11/24 6:10:41

文章目录

  • 一、简介
  • 二、格式
  • 三、举例
  • 四、使用场景
  • 五、@FunctionalInterface注解
  • 六、Lambda表达式的简化方式
    • 省略参数类型:如果上下文已经明确了参数的类型,可以省略参数类型的声明。
    • 省略参数括号:如果只有一个参数,可以省略参数的括号。
    • 省略大括号和return关键字:如果Lambda表达式只有一条语句,并且是返回一个表达式的结果,可以省略大括号和return关键字。
    • 方法引用:如果Lambda表达式只是调用一个已存在的方法,可以使用方法引用来代替Lambda表达式

一、简介

Lambda 表达式是 JDK8 引入的一种新的编程语法,用于简化函数式接口的实现。

Lambda 表达式的出现可以取代大多数匿名内部类,写出更简洁优雅的代码。

二、格式

(参数1,参数2) -> {方法体}

三、举例

在 JDK 8 之前,我们创建线程(实际开发推荐用线程池)并启动可以使用匿名内部类的写法:

new Thread(new Runnable() {
    @Override
    public void run() {
        doBusiness();
    }
}).start();

在 JDK 8 之后,我们可以使用 Lambda 表达式的写法:

new Thread(() -> {
    doBusiness();
}).start();

如果方法体里只有一行代码,我们甚至可以省略大括号:

new Thread(() -> doBusiness()).start();

四、使用场景

通过上面的例子,我们可以看到 Lambda 表达式省略了 new Runnable(),这是可以通过 Thread 的方法参数推导出来的,可以理解,但是为什么方法名(run)也可以省略呢,原因就是 Runnable 接口内部只有 run 这一个抽象方法,当接口只有一个抽象方法的时候,实现类必须重写并且只能重写这个方法,所以就不用关心这个方法叫什么名字了,只需要关心方法参数方法体

五、@FunctionalInterface注解

上面我们讲到,当接口只有一个抽象方法,就可以使用 Lambda 表达式来简化这个接口的匿名内部类的写法,所以 JDK 8 还推出了 @FunctionalInterface 注解,用来定义:有且只有一个抽象方法,但是可以有很多个非抽象方法的接口,这个注解标注在接口上,声明接口是函数式接口,且只是在编译期做校验,如果声明多个抽象方法,就会报错,如下:

image-20230824094300484

这样就可以用 Lambda 表达式来声明这个接口的实现,JDK 8 还提供了四大函数式接口,具体可参考我的另一篇文章:Java8新特性之——函数式接口(Function、Consumer、Supplier、Predicate)

六、Lambda表达式的简化方式

省略参数类型:如果上下文已经明确了参数的类型,可以省略参数类型的声明。

@FunctionalInterface
public interface MyInterface {
    String abstractMethod(String param);
}

public class MyTest {

    public static void main(String[] args) {

        // 原本写法
        testMethod((String param) -> {
            return "Hello " + param;
        });

        // 省略参数类型
        testMethod((param) -> {
            return "Hello " + param;
        });
    }

    private static void testMethod(MyInterface m) {
        String str = m.abstractMethod("World");
        System.out.println(str);
    }
}

省略参数括号:如果只有一个参数,可以省略参数的括号。

@FunctionalInterface
public interface MyInterface {
    String abstractMethod(String param);
}

public class MyTest {

    public static void main(String[] args) {

        // 原本写法
        testMethod((param) -> {
            return "Hello " + param;
        });

        // 省略括号
        testMethod(param -> {
            return "Hello " + param;
        });
    }

    private static void testMethod(MyInterface m) {
        String str = m.abstractMethod("World");
        System.out.println(str);
    }
}

省略大括号和return关键字:如果Lambda表达式只有一条语句,并且是返回一个表达式的结果,可以省略大括号和return关键字。

@FunctionalInterface
public interface MyInterface {
    String abstractMethod(String param);
}

public class MyTest {

    public static void main(String[] args) {

        // 原本写法
        testMethod(param -> {
            return "Hello " + param;
        });

        // 省略括号
        testMethod(param -> "Hello " + param);
    }

    private static void testMethod(MyInterface m) {
        String str = m.abstractMethod("World");
        System.out.println(str);
    }
}

方法引用:如果Lambda表达式只是调用一个已存在的方法,可以使用方法引用来代替Lambda表达式

具体可参考我的另一篇文章:Java8新特性之——方法引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

队列(Queue):先进先出的数据结构队列

栈与队列https://blog.csdn.net/qq_45467165/article/details/127958960?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127958960%22%2C%22source%22%3A%22qq_45467165%22%7D 队列(Queue)是一种常见的线…

VS+Qt 自定义Dialog

与QtCreator不同,刚用VS添加Qt Dialog界面有点懵,后整理了下: 1.右击项目,选择“添加-模块”,然后选择“Qt-Qt Widgets Class” 2.选择基类[1]QDialog,更改[2]ui文件名称,修改定义Dialog[3]对应类名&#…

前端工程化之模块化

模块化的背景 前端模块化是一种标准,不是实现理解模块化是理解前端工程化的前提前端模块化是前端项目规模化的必然结果 什么是前端模块化? 前端模块化就是将复杂程序根据规范拆分成若干模块,一个模块包括输入和输出。而且模块的内部实现是私有的&…

c++学习之内存管理

目录 1.c/c内存分布 2.new与delete/malloc与free c内存管理方式: new/delete操作内置类型: new/delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 malloc/free和new/delete的区别 1.c/c内存分…

Linux——初始

linux是一个操作系统,目前主流就是在服务器后端被选作服务器的操作系统来使用,所以我们没有直接接触到。 Linux的历史和概念 先是国家投钱给科研技术人员,科研技术人员将科研成果部分投入生活用品卖给老百姓,老百姓购买产品同时还…

Java课题笔记~ 综合案例

3.综合案例 3.1 功能介绍 以上是我们在综合案例要实现的功能。除了对数据的增删改查功能外,还有一些复杂的功能,如 批量删除、分页查询、条件查询 等功能 批量删除 功能:每条数据前都有复选框,当我选中多条数据并点击 批量删除 按…

YOLOv5算法改进(4)— 添加CA注意力机制

前言:Hello大家好,我是小哥谈。注意力机制是近年来深度学习领域内的研究热点,可以帮助模型更好地关注重要的特征,从而提高模型的性能。在许多视觉任务中,输入数据通常由多个通道组成,例如图像中的RGB通道或…

村口的人家排放污水,污水浸染了整个村子,怎么办

从前有一个很不错的村子里,村子里有很多户人家,随着生活水平越来越好,房子也修起来了,柏油马路也宽敞了,大家进出村子,都要走那条马路,要不就出不去。 目录 1. 修厕所 2. 村口的日家 3. 告诉…

商城的TPS与并发用户数是如何换算的?

商城的TPS与并发用户数的换算关系可以通过以下公式计算: TPS 并发用户数 / 平均事务响应时间 其中,平均事务响应时间是指系统处理一个事务所需的平均时间。 下面是商城性能测试的一些用例示例: 用户登录: 目标:测…

4.物联网LWIP之C/S编程,stm32作为服务器,stm32作为客户端,代码的优化

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置(FREERTOS配置,ETH配置,LWIP配置) 1.FREERTOS配置 为什么要修改定时源为Tim1?不用systick? 原因:HAL库与FREERTOS都需要使用systi…

【Python原创毕设|课设】基于Python Flask的上海美食信息与可视化宣传网站项目-文末附下载方式以及往届优秀论文,原创项目其他均为抄袭

基于Python Flask的上海美食信息与可视化宣传网站(获取方式访问文末官网) 一、项目简介二、开发环境三、项目技术四、功能结构五、运行截图六、功能实现七、数据库设计八、源码获取 一、项目简介 随着大数据和人工智能技术的迅速发展,我们设…

【JavaEE进阶】MyBatis表查询

文章目录 一. 使用MyBatis完成数据库的操作1. MyBatis程序中sql语句的即时执行和预编译1.1 即时执行(${})1.2 预编译(#{})1.3 即时执行和预编译的优缺点 2. 单表的增删改等操作2.1 增加操作2.2 修改操作2.3 删除操作2.4 like(模糊…

星际争霸之小霸王之小蜜蜂(六)--让子弹飞

目录 前言 一、添加子弹设置 二、创建子弹 三、创建绘制和移动子弹函数 四、让子弹飞 五、效果 总结 前言 小蜜蜂的基本操作已经完成了,现在开始编写子弹的代码了。 一、添加子弹设置 在我的预想里,我们的小蜜蜂既然是一只猫,那么放出的子弹…

基于小波神经网络的短时交通流量预测Matlab代码

1案例背景 1.1小波理论 小波分析是针对傅里叶变换的不足发展而来的。傅里叶变换是信号处理领域中应用最广泛的一种分析手段,然而它有一个严重不足,就是变换时抛弃了时间信息,通过变换结果无法判断某个信号发生的时间,即傅里叶变换在时域中没有分辨能力。小波是长度有限、平均为…

分布式与微服务相关知识

分布式与微服务 1.zookeeper是什么2.zookeeper保证数据一致性3.zookeeper的快速领导者选举是怎么实现的4.CAP理论5.BASE理论6.分布式id生成方案(1)UUID(2)数据库自增序列(3)Leaf-segment(4&…

Linux下的系统编程——vim/gcc编辑(二)

前言: 在Linux操作系统之中有很多使用的工具,我们可以用vim来进行程序的编写,然后用gcc来生成可执行文件,最终运行程序。下面就让我们一起了解一下vim和gcc吧 目录 一、vim编辑 1.vim的三种工作模式 2.基本操作之跳转字符 &a…

实现外网访问本地服务

最近开发需要其他项目组的人访问我本地服务测试,但又不在同一个地方,不能使用内网访问,所以需要外网访问本地服务功能. 条件: 1.需要一台具备公网IP的服务器 我用的服务器是windows,电脑也是Windows系统 2.下载frp 软件,只需要下载一份就可以了,分别放到服务器上和本地目录既…

2011-2021年全国各省绿色创新效率数据(原始数据+测算结果)

2011-2021年全国各省绿色创新效率数据(原始数据测算结果) 2011-2021年全国各省绿色创新效率 1、时间:2011-2021年 2、范围:全国31省市 3、来源:各省年鉴、科技年鉴、环境年鉴 4、指标:地区、编号、年份、R&D人…

设计模式大白话——命令模式

命令模式 一、概述二、经典举例三、代码示例(Go)四、总结 一、概述 ​ 顾名思义,命令模式其实和现实生活中直接下命令的动作类似,怎么理解这个命令是理解命令模式的关键!!!直接说结论是很不负责…

树形结构的快速生成

背景 相信大家都遇到过树形结构,像是文件列表、多级菜单、评论区的设计等等,我们都发现它有很多层级,第一级可以有多个,下边的每一个层级也可以有多个;有的可以设计成无限层级的,有的只能设计成两级。那么…