Lambda表达式与函数式接口

Lambda表达式与函数式接口

1. 函数式接口

1.1 什么是函数式接口

        函数式接口是指只有一个抽象方法的接口(Object的public方法除外。。这种接口可以使用Lambda表达式实现,从而实现函数式编程的特性。另外函数式接口可以有默认方法和静态方法。
         建议:在定义函数式接口时,建议标记@FunctionalInterface注解,虽然不标记也不会影响接口的功能,但加上这个注解可以帮助编辑器检测是否错误地添加了多个抽象方法。
示例:

@FunctionalInterface
public interface Func{Object clone();   // Object的方法void run();       // 自定义抽象方法
}

​1.2  4个基本的函数式接口

        消费型接口:Consumer void accept(T t):
        消费型接口表示接收一个参数并执行某些操作,但没有返回值。它常用于需要执行一些操作但不需要返回结果的场景,例如遍历合、修改对象状态等,例如

Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("hello world");

        供给型接口:Supplier T get():
供给型接口表示不需要接收任何参数,但需要返回一个结果。它常用于需要生成某些数据的场景,例如生成随机数、获取当前时间等,例如

Supplier<Integer> supplier = () -> (int) (Math.random() * 100);
System.out.println(supplier.get());

        函数型接口:Function<T,R> R apply(T t):
函数型接口表示接收一个参数并返回一个结果。它常用于需要对某些数据进行处理并返回结果的场景,例如字符串转换、数据加工等。例如:

Function<String, Integer> function = s -> s.length();
System.out.println(function.apply("hello world"));

        判断型接口:Predicate boolean test(T t):
判断型接口表示接收一个参数并返回一个布尔值。它常用于需要对某些数据进行判断并返回布尔值的场景,例如过滤集合、判断对象状态等,例如

Predicate<Integer> predicate = i -> i > 0;
System.out.println(predicate.test(-1));

1.3 函数式接口具有一些重要的特点和应用场景:

  1. 特点:函数式接口只能有一个抽象方法,但可以有多个默认方法或静态方法。这使得函数式接口非常简洁和灵活,能够用于实现各种功能。
  2. 应用场景:
  • 简化代码:通过将一段代码抽象为一个函数式接口,可以在多个地方重复使用它,从而简化代码结构。
  • 并行流处理:在Java 8中,可以使用函数式接口来处理并行流,实现数据的转换和过滤等操作。
  • 组合逻辑:函数式接口可以用于定义复杂的逻辑操作,如两个元素的组合逻辑。
  • 事件处理:在GUI编程中,函数式接口可以用于处理各种事件,如按钮点击、鼠标移动等。
  • 测试:在单元测试中,函数式接口可以用于定义测试断言,提高测试的准确性和效率。

2. lambda表达式

2.1 什么是lambda?

        Lambda是JDK8的语法糖。它可以对某些匿名内部类的写法进行简化,它是函数式编程的一个重要体现。让我们不用关注什么是对象,只需要关注两部分内容即可: 参数列表 和 方法体,只关注我们对数据做了什么操作,可以说它Lambda表达式就是一个对象。总之,lambda表达式是实现函数式接口的一个快捷方式。
        注意:必须是函数式接口才可以使用lambda表达式

(参数)-> {⽅法体
};
public class LambdaTest {@Testpublic void test1(){
// Runnable只有一个抽象方法Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("知昂可");}};r1.run();System.out.println("***********************");//Lambda表达式Runnable r2 = () -> {System.out.println("知昂可");};r2.run();}@Testpublic void test2(){Comparator<Integer> com1 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1,o2);}};int compare1 = com1.compare(12,21);System.out.println(compare1);System.out.println("***********************");//Lambda表达式的写法,箭头后的{}是可以省略的,参数类型确定也可以省略Comparator<Integer> com2 =  (Integer o1, Integer o2) -> Integer.compare(o1,o2);//  Comparator<Integer> com2 =  (o1, o2) -> Integer.compare(o1,o2);int compare2 = com2.compare(23,21);System.out.println(compare2);System.out.println("***********************");//方法引用Comparator<Integer> com3 = Integer :: compare;int compare3 = com3.compare(23,21);System.out.println(compare3);}
}
public class LambdaTest1 {//语法格式一:无参,无返回值@Testpublic void test1(){Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("知昂可");}};r1.run();System.out.println("***********************");Runnable r2 = () -> {System.out.println("知昂可");};r2.run();}//语法格式二:Lambda 需要一个参数,但是没有返回值。@Testpublic void test2(){Consumer<String> con = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}};con.accept("知昂可在学习");System.out.println("*******************");Consumer<String> con1 = (String s) -> {System.out.println(s);};con1.accept("知昂可在摸鱼");}//语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”@Testpublic void test3(){Consumer<String> con1 = (String s) -> {System.out.println(s);};con1.accept("知昂可休息中...");System.out.println("*******************");Consumer<String> con2 = (s) -> {System.out.println(s);};con1.accept("知昂可休息中...");}@Testpublic void test3_1(){int[] arr = {1,2,3,4}; //类型推断HashMap<String,Integer> map = new HashMap<>();//类型推断var entrySet = map.entrySet(); //类型推断 ,在jdk10及之后可以用,现持续存在}//语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略@Testpublic void test4(){Consumer<String> con1 = (s) -> {System.out.println(s);};con1.accept("知昂可休息中...");System.out.println("*******************");Consumer<String> con2 = s -> {System.out.println(s);};con2.accept("知昂可正在睡觉...");}//语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值@Testpublic void test5(){Comparator<Integer> com1 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {System.out.println(o1);System.out.println(o2);return o1.compareTo(o2);}};System.out.println(com1.compare(12,21));System.out.println("*****************************");Comparator<Integer> com2 = (o1, o2) -> {System.out.println(o1);System.out.println(o2);return o1.compareTo(o2);};System.out.println(com2.compare(12,21));}//语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略@Testpublic void test6(){Comparator<Integer> com1 = (o1,o2) -> {return o1.compareTo(o2);};System.out.println(com1.compare(12,6));System.out.println("*****************************");Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);System.out.println(com2.compare(12,16));}@Testpublic void test7(){Consumer<String> con1 = s -> {System.out.println(s);};con1.accept("知昂可正在玩耍...");System.out.println("*****************************");}
}

总结:

Lambda表达式的使用举例:
        (o1, o2) -> Integer.compare(o1,o2);

Lambda表达式的格式举例:
        lambda形参列表 -> lambda体

Lambda表达式的格式:
        lambda操作符或箭头操作符
        -> 的左边: lambda形参列表,对应着要重写的接口中的抽象方法的形参列表。
        -> 的右边: lambda体,对应着接口的实现类要重写的方法的方法体。
Lambda表达式的本质:
        一方面,lambda表达式作为接口的实现类的对象。 --->说白了Lambda表达式就是对象, "万事万物皆对象" 。       另一方面,lambda表达式是一个匿名函数。

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

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

相关文章

Python 安装faiss失败

报错 遇到ModuleNotFoundError: No module named faiss&#xff0c;使用下面语句安装失败。 pip3 install faiss 遇到 ERROR: Could not find a version that satisfies the requirement faiss (from versions: none) ERROR: No matching distribution found for faiss …

模块化 手写实现webpack

模块化 common.js 的导入导出方法&#xff1a; require \ export 和 module.exports export 和 module.export nodejs 内存1.4G -> 2.8G cjs ESModule 主要区别&#xff1a; require属于动态类型&#xff1a;加载执行 同步 esmodul是静态类型&#xff1a;引入时并不会真的去…

[C++][算法基础]01背包问题(动态规划)

有 &#x1d441; 件物品和一个容量是 &#x1d449; 的背包。每件物品只能使用一次。 第 &#x1d456; 件物品的体积是 &#x1d463;&#x1d456;&#xff0c;价值是 &#x1d464;&#x1d456;。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量…

Autosar AP的基本构成

1. 引言 Autosar AP的体系结构是怎样的呢&#xff1f;从整体的宏观的方向上划分&#xff0c;分为 1&#xff09;应用层&#xff0c;其中放置各种应用组件SWCs。2&#xff09;运行时基本功能软件族群&#xff0c;提供基本AutoSar基本软件中间件&#xff0c;比如经典的通信服务…

tsdx 打包ts项目

问题&#xff1a;sdk项目里面有node代码和浏览器代码&#xff0c;打包产物要同时支持两个平台。 1、 解读tsdx build命令 tsdx使用了rollup打包&#xff0c;

【漏洞复现】云时空社会化商业ERP系统slogin SQL注入漏洞

漏洞描述&#xff1a; 云时空社会化商业ERP系统slogin存在SQL注入漏洞&#xff0c;攻击者可以通过此漏洞获取数据库敏感信息。 搜索语法: Fofa-Query: app"云时空社会化商业ERP系统" 漏洞详情&#xff1a; 1.云时空社会化商业ERP系统。 2.漏洞POC&#xff1a; …

智慧园区引领未来产业趋势:科技创新驱动园区发展,构建智慧化产业新体系

目录 一、引言 二、智慧园区引领未来产业趋势 1、产业集聚与协同发展 2、智能化生产与服务 3、绿色可持续发展 三、科技创新驱动园区发展 1、创新资源的集聚与整合 2、创新成果的转化与应用 3、创新文化的培育与弘扬 四、构建智慧化产业新体系 1、优化产业布局与结构…

JavaScript:将input标签中的内容打印到控制台

使用浏览器进行开发时&#xff0c;按F12可以查看网页信息。 目标&#xff1a;实现将input标签中的内容&#xff0c;打印到控制台&#xff08;console&#xff09; HTML页面的关键代码实现&#xff1a; 登录功能&#xff1a; HTML代码&#xff1a; <div class"form-…

[八股]从反射到动态代理

从反射到动态代理 这部分文章将能解答以下问题&#xff1a; JVM的类加载过程中加载这一阶段做了什么&#xff1f; 讲一下设计模式中的代理模式 动态代理是什么&#xff1f; Spring是如何实现AOP的? 初识反射 Java反射可以在程序运行时动态加载类并获取类的详细信息&#xff0…

Node.js 22 发布,原生支持 WebSocket 客户端

昨日&#xff0c;Node.js 官方博客正式宣布 Node.js 22 的发布&#xff01;新版本亮点包括 require() ES 模块、WebSocket 客户端、V8 JavaScript 引擎的更新等&#xff01; Node.js 22 将在 10 月进入长期支持 (LTS)&#xff0c;但在此之前&#xff0c;它将是接下来六个月的 …

【AI相关】数学和统计学知识

数学和统计学的知识可以分为两部分&#xff1a; 一部分是线性代数中的基础概念&#xff0c;比如标量、向量和张量。 另一部分是概率统计中常见的分布类型&#xff0c;比如正态分布和伯努利分布。 线性代数 什么是标量&#xff1f; 标量是一个单独的数&#xff0c;可以是整…

PHP安装dbase扩展,2024最新安装日志,注意PHP版本、扩展目录路径、文件权限3个大坑

今天在我的免费云服务器&#xff0c;阿贝云上安装dbase扩展。系统是centos&#xff0c;安装好了宝塔面板。 第一步&#xff0c; yum install php-pear pecl install dbase &#xff08;显示Installing ‘/usr/lib64/php/modules/dbase.so’ install ok: channel://pecl.php.net…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(二)

09 电路设计 前面介绍了系统的硬件框图如下&#xff1a; 硬件基本分为三块&#xff0c;两个摄像节点&#xff0c;一个终端节点。 1. 摄像节点硬件 摄像节点由一个DE10-Nano开发板和一个D8M摄像头实现&#xff0c;DE10-Nano开发板的HDMI接口外接HDMI显示器来显示拍摄到的视频。…

Linux:在线扩容

目录 项目场景 所需技术 操作步骤 Ⅰ&#xff1a;查看pv&#xff08;物理卷&#xff09;、vg&#xff08;卷组&#xff09;大小是否还够扩容 Ⅱ&#xff1a;vda磁盘新增分区vda3 Ⅲ&#xff1a;pv&#xff08;逻辑卷&#xff09;扩容 Ⅳ&#xff1a;vg&#xff08;卷组&…

ABC350 FG 题解

ABC350 FG 题解 本人 Unrated 在开始后 1h 参加&#xff0c;20 分钟过 F&#xff0c;1h 过 G。 F Overview 唐&#xff0c;史上最水 F。 Description 有一个串 S S S&#xff0c;包含大小写字母&#xff0c;( 和 )&#xff0c;保证括号匹配。 对于每组匹配括号&#xf…

vue3的getCurrentInstance获取当前组件实例

vue3的setup中没有this时需要使用getCurrentInstance()来获取。 在 Vue 3 中&#xff0c;getCurrentInstance 方法可以在组合式 API&#xff08;Composition API&#xff09;中获取当前组件实例。这个方法返回一个包含了组件实例的对象&#xff0c;你可以用它来访问组件的 pro…

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写)

文章目录 1、C API 官方文档2、初始化 MYSQL3、连接 MySQL设置连接字符集&#xff08;使得客户端编码方式匹配&#xff09; 4、下发 mysql 指令5、获取 mysql 查询结果(保存起来)获取行与列遍历存储结果 6、释放 MYSQL\_RES 对象7、关闭 MySQL 连接8、总结 1、C API 官方文档 …

动态规划---斐波那契数列模型

目录 一、斐波那契数列的基本概念 二、动态规划在斐波那契数列中的应用与优势 三、实际案例&#xff1a;使用动态规划解决斐波那契数列问题 四、动态规划问题的做题步骤 五、例题 1、第N个泰波那契数---点击跳转题目 2、三步问题----点击跳转题目 3、最小花费爬楼梯---…

FANUC机器人socket通讯硬件配置

一、添加机器人选配包 Fanuc机器人要进行socket通讯&#xff0c;需要有机器人通讯的选配包&#xff0c;1A05B-2600-R648 User Socket Msg&#xff0c;1A05B-2600-R632 KAREL&#xff0c;1A05B-2600-R566 KAREL Diagnostic&#xff0c;1A05B-2600-J971 KAREL Use Sprt FCTN。 二…

【漏洞复现】WebLogic XMLDecoder反序列化(CVE-2017-10271)

1、漏洞描述 CVE-2017-10271漏洞产生的原因大致是Weblogic的WLS Security组件对外提供webservice服务&#xff0c;其中使用了XMLDecoder来解析用户传入的XML数据&#xff0c;在解析的过程中出现反序列化漏洞&#xff0c;导致可执行任意命令。攻击者发送精心构造的xml数据甚至能…