【Java笔记】Lambda表达式

文章目录

  • 回顾下Interface
    • Why Interface
    • Interface例子
      • 需求
      • 实现需求
  • Lambda表达式
    • Why Lambda
    • Lambda表达式
    • Lambda表达式实现`send()`
      • 无参数的抽象方法
      • 有参数的抽象方法
      • 多参数、有返回值的抽象方法
      • 赋值给变量
      • Email or SMS?
  • Lambda表达式的限制
  • Reference

Lambda表达式是Java函数式编程的核心概念之一,是一种语法糖

  • 语法糖(Syntactic sugar):计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用
  • Java中其他的语法糖:for-each,断言等等

用于简化实现函数式接口Functional Interface

回顾下Interface

Why Interface

接口用来定义一个协议或约定,只提供抽象方法

  • 抽象方法 Abstract Method:只声明方法,不提供方法的具体实现
    • 但JDK1.8以后,接口可以有方法体与具体实现的方法(default)

将接口的声明与具体实现分开,业务中只需要关心方法,不需要关心具体的实现类

从而实现代码的解耦和模块化

Interface例子

需求

通过一个方法发送多种不同形式的消息,比如Email邮件消息、SMS短消息

实现需求

  • 定义Message接口

    public interface Message{void send(); // abstract method
    }
    
  • Email实现Message接口

    public class Email implements Message{String email;public Email() {}@Overridepublic void send() {System.out.println("This is an email.");}
    }
    
  • Sms实现Message接口

    public class Sms implements Message{String phoneNumber;public Sms() {}@Overridepublic void send() {System.out.println("This is a sms.");}
    }
    
  • main中测试

    public class Main {public static void main(String[] args) {Message email = new Email();Message sms = new Sms();sendMessage(email);sendMessage(sms);}static void sendMessage(Message message){// 参数类型为Message接口,可以传入Email或SMS对象message.send();}
    }
    

Lambda表达式

Why Lambda

可以看出,上面的例子中仅发送一条消息,也需要很多步骤:

  • 先根据Message接口实现Email或Sms类
  • 在实现类中实现接口的抽象方法
  • 创建Message的Email或Sms实例
  • 发送

Lambda表达式可以提供一种快速简介的方式实现接口,抽象方法的实现直接在Lambda表达式里定义

Lambda表达式

(parameters)->{statements;}

  • () 括号 Parentheses:对应抽象方法的括号,里面是抽象方法的参数
    • 如果只有一参数,可以省略:parameter ->{statements;}
  • - 连字号 Hyphen
  • > 箭头Arrow
  • {} 大括号Curly Braces:Lambda体,对应抽象方法的大括号,里面放具体行为
    • 如果只有一行,可以省略:(parameters) -> expression

Lambda表达式实现send()

无参数的抽象方法

public interface Message{void send(); // abstract method
}
  • 一行:(parameters) -> expression
sendMessage(() -> System.out.println("This is an email.");
);

输出:

This is an email.
  • 多行:(parameters)->{statements;}
sendMessage(() -> {System.out.println("This is an email.");System.out.println("Hi there!");
});

输出:

This is an email.
Hi there!

有参数的抽象方法

public interface Message{void send(String name); // abstract method
}
public class Main {public static void main(String[] args) {sendMessage((name) -> {System.out.println("This is an email to " + name);});}static void sendMessage(Message message){// 参数类型为Message接口,可以传入Email或SMS对象message.send("Hansdas");}
}

由于只有一个参数跟一行代码,Lambda表达式可以简化

public class Main {public static void main(String[] args) {sendMessage(name -> System.out.println("This is an email to " + name););}static void sendMessage(Message message){// 参数类型为Message接口,可以传入Email或SMS对象message.send("Hansdas");}
}

多参数、有返回值的抽象方法

public interface Message{string send(String name, String title); // abstract method
}
public class Main {public static void main(String[] args) {sendMessage((name, title) -> {System.out.println("This is an email to " + title+ " " +name);return "success!";});}static void sendMessage(Message message){// 参数类型为Message接口,可以传入Email或SMS对象String status =  message.send("Hansdas", "Mr");}
}

赋值给变量

Lambda表达式也可以赋值给对应接口类型的变量

public class Main {public static void main(String[] args) {Message lambda = (name, title) -> {System.out.println("This is an email to " + title+ " " +name);return "success!";};}static void sendMessage(Message message){// 参数类型为Message接口,可以传入Email或SMS对象String status =  message.send("Hansdas", "Mr");}
}

Email or SMS?

回到开始的需求,需要发送Email或SMS类型的信息,此时不需要创建对应类实现接口、实例化对象、调用对应方法

只需要早Lambda表达式中稍作修改

public class Main {public static void main(String[] args) {sendMessage((name, title) -> {System.out.println("This is an SMS to " + title+ " " +name);return "success!";});}static void sendMessage(Message message){// 参数类型为Message接口,可以传入Email或SMS对象String status =  message.send("Hansdas", "Mr");}
}

Lambda表达式的限制

  • Lambda表达式只能用于函数式接口
    • 函数式接口Functional Interface:有且只有一个抽象方法的接口
    • 因为接口如果有多个抽象方法,lambda不值得要实现哪个抽象方法
  • 可以使用FunctionalInterface标注函数式接口,建议使用,
    • 但不是必须的,只要满足函数式接口【只有一个抽象方法】的条件,Java会自动将其作为函数式接口

Reference

依然来自AlbertShen

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

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

相关文章

FPGA设计_加法器

文章目录 前言补充:各种门电路符号一、半加器二、全加器三、串行进位加法器3.1、verilog代码设计 四、超前进位加法器4.1、verilog代码设计 五、进位链CARRY4 前言 在之前一篇介绍7系列FPGA底层资源的时候,我们提到过每一个slice当中有一个CARRY4&#…

NodeJS 基础入门学习手册

什么是 Node.js 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快…

玫瑰图和雷达图(自备)

目录 玫瑰图 数据格式 绘图基础 绘图升级(文本调整) 玫瑰图 下载数据data/2020/2020-11-24 mirrors_rfordatascience/tidytuesday - 码云 - 开源中国 (gitee.com) R语言绘图—南丁格尔玫瑰图 - 知乎 (zhihu.com) 数据格式 rm(list ls()) libr…

2024年新算法-冠豪猪优化算法(CPO),CPO-RF-Adaboost,CPO优化随机森林RF-Adaboost回归预测-附代码

冠豪猪优化算法(CPO)是一种基于自然界中猪群觅食行为启发的优化算法。该算法模拟了猪群在寻找食物时的集群行为,通过一系列的迭代过程来优化目标函数,以寻找最优解。在这个算法中,猪被分为几个群体,每个群体…

CA根证书——https安全保障的基石

HTTPS通信中,服务器端使用数字证书来证明自己的身份。客户端需要验证服务器发送的证书的真实性。这就需要一个可信的第三方机构,即CA,来颁发和管理证书。CA根证书是证书颁发机构层次结构的顶级证书,客户端信任的所有证书都可以追溯…

[lesson01]学习C++的意义

学习C的意义 C语言特点 C语言是在实践的过程中逐步完善起来的 没有深思熟路的设计过程残留量过多低级语言的特征 C语言的目标是高效 最终程序执行效率的高效 软件方法论的发展 面相过程程序设计:数据结构 算法 主要解决科学计算问题,用户需求简单而…

python实现泊松回归

1 什么是基于计数的数据? 基于计数的数据包含以特定速率发生的事件。发生率可能会随着时间的推移或从一次观察到下一次观察而发生变化。以下是基于计数的数据的一些示例: 每小时穿过十字路口的车辆数量每月去看医生的人数每月发现的类地行星数量 计数数…

行车记录打不开?别慌,数据恢复有高招!

行车记录打不开,这恐怕是许多车主都曾经遭遇过的烦恼。在驾驶途中,行车记录仪本应是记录美好瞬间、保障行车安全的重要工具,但一旦它出现打不开的情况,所有的期待与信赖便瞬间化为乌有。面对这种情况,我们该如何应对&a…

web学习笔记(五十一)

目录 1. post请求和get请求的区别 2. CORS 跨域资源共享 2.1 什么是同源 2.2 什么是同源策略 2.3 如何实现跨域资源共享 2.4 使用 cors 中间件解决跨域问题 2.5 JSONP 接口 2.6 实现 JSONP 接口的步骤 1. post请求和get请求的区别 传参方式不同:get请求参数…

文本文件操作

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 文件操作 程序运行时&#xff0c;产生的数据都是临时数据&#xff0c;程序一旦运行结束都会被释放。通过文件可以将数据持久化。 C中对文件进行操作需要包含头文件<fstream> 文件…

2024年抖音小店的保证金是多少?真的可以做0元保证金的店铺吗?

大家好&#xff0c;我是电商糖果 2024年想要入驻抖音小店的商家依旧很多&#xff0c;关于小店的保证金问题也有不少人前来咨询。 大家问的最多的是可以开通0元保证金的店铺吗&#xff1f;以及2024年抖音小店保证金是多少&#xff1f; 这里糖果给大家一个个解答。 可以开通0…

Linux 服务service(一)

目录 一、服务入门1.1 概述1.2 创建及管理Systemd服务1.2.1 创建service文件1.2.2 创建脚本文件1.2.3 管理Systemd服务1.2.4 服务输出 1.3 服务文件常用参数1.3.1 UNIT单元1.3.2 service单元1.3.3 install单元 1.4 target文件常用参数1.5 周期性任务timer1.5.1 创建timer文件1.…

第十八章 算法

一、介绍 1.1 什么是算法 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获…

注意力机制篇 | YOLOv8改进之在C2f模块添加级联群体注意力机制CGAttention | CVPR 2023

前言:Hello大家好,我是小哥谈。级联群体注意力机制(Cascading Group Attention)是一种注意力机制,它通过对输入序列进行逐级处理来捕捉不同层次的语义结构。该机制主要由两个关键部分组成:群体注意力和级联过程。在具体实现上,级联群体注意力机制通过构建一个层次结构,…

YOLOv9改进策略 :IoU优化| Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

💡💡💡本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合,实现高效涨点 💡💡💡适用场景:小目标数据集,涨点近两个点,强烈推荐 《YOLOv9魔术师专栏》将从以下…

第十七章 Kafka

一、特性 - 高吞吐、低延迟 - 高伸缩性 - 持久性、可靠性 - 容错性 - 高并发 通过 O(1)的磁盘数据结构提供消息的持久化&#xff0c;这种结构对于即使数以 TB 的消息存储也能够保持长时间的稳定性能。 高吞吐量&#xff1a;即使是非常普通的硬件 Kafka 也可以支持每秒数百…

内网靶机~~dc-2

一、信息收集 1.端口扫描&#xff1a; nmap -sV -p 1-10000 10.1.1.4 2.CMS识别 3.目录扫描&#xff1a; dirsearch http://10.1.1.4/ 4.FLAG1 似乎让我们用cewl生成密码字典&#xff0c;并爆破登录。 cewl -w rewl_passwd.txt http://dc-2/index.php/flag/ 总结&#xff…

跑腿小程序|基于微信小程序的跑腿平台小程序设计与实现(源码+数据库+文档)

跑腿平台小程序目录 目录 基于微信小程序的跑腿平台小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、跑腿任务管理 3、任务类型管理 4、公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

蓝桥杯算法题——暴力枚举法

先估算这个数小于3的50次方 cnt0 for i in range(50):for j in range(50):for k in range(50):a3**ib5**jc7**kif a*b*c<59084709587505:cnt1 print(cnt-1)#当ijk都为0时&#xff0c;a*b*c1不是幸运数字所以要减去

设计模式(13):模板方法模式

场景&#xff1a; 实现一个功能时&#xff0c;整体步骤很固定&#xff0c;但是&#xff0c;某些部分易变。易变部分可以抽象出来&#xff0c;供子类实现。 开发中常见的场景 非常繁琐&#xff0c;各个框架&#xff0c;类库中都有它的影子&#xff0c;比如常见的有&#xff1…