进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则

目录

        1.0 什么是 Lambda 表达式?

        1.1 既然跟匿名内部类相关,先来回顾匿名内部类。

         1.2 Lambda 表达式与匿名内部类之间的关系。

        1.3 函数式接口

        1.4 在具体代码中来操作一下

        2.0 Lambda 表达式省略规则


        1.0 什么是 Lambda 表达式?

        Lambda 表达式是一种匿名函数,它可以在代码中以简洁的方式表示一个功能或行为。Lambda 表达式通常由参数列表箭头符号函数体组成。参数列表定义了该函数接受的输入参数,箭头符号表示函数体的开始,函数体则定义了函数的具体实现。Lambda 表达式可以作为一个整体被传递给其他函数或方法,也可以直接被调用。

        1.1 既然跟匿名内部类相关,先来回顾匿名内部类。

        匿名内部类是一种在Java中定义匿名类的方式。它允许在创建对象的同时定义该对象的类,并且不需要为该类单独命名。通常情况下,我们需要先定义一个类,然后才能创建该类的对象。但是在某些场景下,我们只需要定义一个临时的类来实现某个接口或继承某个类的功能,这时就可以使用匿名内部类。简单的理解就是减少了新类型的出现。

         1.2 Lambda 表达式与匿名内部类之间的关系。

        Lambda 表达式用于简化匿名内部类的代码写法。

代码如下:

未用 Lambda 表达式进行简化匿名内部类。

public class Text_Lambda {public static void main(String[] args) {Animal cat = new Animal(){@Overridepublic void fun() {System.out.println("是只猫");}};Animal dog = new Animal() {@Overridepublic void fun() {System.out.println("是只狗");}};cat.fun();dog.fun();}
}interface Animal{public void fun();
}

运行结果如下:

Lambda 表达式进行简化匿名内部类。

public class Text_Lambda {public static void main(String[] args) {/*        Animal cat = new Animal(){@Overridepublic void fun() {System.out.println("是只猫");}};*///下面用Lambda表达式简化的代码跟上面的代码式等效的Animal cat = () -> {System.out.println("是只猫");};/*        Animal dog = new Animal() {@Overridepublic void fun() {System.out.println("是只狗");}};*///下面用Lambda表达式简化的代码跟上面的代码式等效的Animal dog = () -> {System.out.println("是只狗");};cat.fun();dog.fun();}
}
interface Animal{public void fun();
}

运行结果如下:

        再简单小结一下,Lambdab 表达式存在的意义就是简化匿名内部类,具体格式为 (被重写方法的形参列表)-> {(被重写方法的方法体)}

        1.3 函数式接口

        现在知道 Lambda 表达式可以简化匿名内部类,但是需要注意的是,并不是所有的匿名内部类都可以用 Lambda 表达式进行简化的,只有函数式接口才可以被 Lambda 表达式简化。

        什么是函数式接口?

        函数式接口是指只包含一个抽象方法接口。在Java中,函数式接口是支持函数式编程的基础,它可以用作 Lambda 表达式的目标类型。

        Java 8引入了@FunctionalInterface注解,用于标识一个接口为函数式接口。编译器会检查被标注的接口是否符合函数式接口的定义,如果不符合,编译器会报错。

如:

        总的来说,如果是接口并且只包含了一个抽象方法,或者引用了 @FunctionalInterface注解的时候都为函数式接口,都可以被 Lambda 表达式简化。

        1.4 在具体代码中来操作一下

               例子 1.0 :

        回顾在介绍到 Arrays 类中的 sort() 静态方法中其中有一个参数就是匿名内部类。

这个方法具体的介绍在此链接:

进阶JAVA篇-如何理解作为参数使用的匿名内部类与 Arrays 类的常用API(九)-CSDN博客

        如果想要把这个匿名内部类用 Lambada 表达式进行简化,就想要了解它是否为函数式接口。

该匿名内部类引用了@FunctionalInterface注解,因此,它可以被 Lambda 表达式简化。

Lambda 表达式简化匿名内部类代码如下: 

import java.util.Arrays;public class ArraysAPI {public static void main(String[] args) {Student[] students = new Student[4];students[0] = new Student("张三",32);students[1] = new Student("李四",21);students[2] = new Student("王五",20);students[3] = new Student("赵六",22);/*        Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {if (o1.getAge()> o2.getAge()){return 1;} else if (o1.getAge()< o2.getAge()) {return -1;}return 0;}});*/Arrays.sort(students,(Student o1, Student o2)-> {if (o1.getAge()> o2.getAge()){return 1;} else if (o1.getAge()< o2.getAge()) {return -1;}return 0;});System.out.println(Arrays.toString(students));}
}

提醒一下,以上该代码省略了 Student 类。

运行结果如下:

        已经用 Lambda 表达式进行简化的代码与被屏蔽的代码(未用 Lambda 表达式进行简化)相对比,确实式简化了很多。

               例子 2.0 :

        回顾在介绍到 Arrays 类中的 setAll() 静态方法中其中一个参数为匿名内部类。

 这个方法具体的介绍在此链接:

进阶JAVA篇-如何理解作为参数使用的匿名内部类与 Arrays 类的常用API(九)-CSDN博客

        同样的, 如果想要把这个匿名内部类用 Lambada 表达式进行简化,就想要了解它是否为函数式接口。

很显然,这个引用了@FunctionalInterface注解,因此,它可以被 Lambda 表达式简化。

 用 Lambda 表达式简化匿名内部类代码如下: 

import java.util.Arrays;public class ArraysAPI {public static void main(String[] args) {double[] arr = new double[]{1.0,2.0,9,4.0,5.0};
/*        Arrays.setAll(arr, new IntToDoubleFunction() {@Overridepublic double applyAsDouble(int value) {return arr[value] * 0.8;}});*/Arrays.setAll(arr, (int value) ->{return arr[value] * 0.8;});System.out.println(Arrays.toString(arr));}
}

运行结果如下:

        2.0 Lambda 表达式省略规则

        通过以上的讲解,现在知道函数式接口是可以通过 Lambda 表达式简化的,那么还能不能更进一步简化呢?

        答案肯定是无容置疑的,可以继续简化。

        具体来介绍省略的规则:

        1. 参数类型可以省略不写。

        2.  如果只有一个参数的,参数类型可以省略不写,同时()也可以不写。

        3. 如果重写的方法体只有一行代码,可以省略大括号不写,同时要省略分号!此时,如果这行代码是 return 语句,也必须去掉 return 语句。

代码如下:

import java.util.Arrays;public class ArraysAPI {public static void main(String[] args) {double[] arr = new double[]{1.0,2.0,9,4.0,5.0};//第一代的样子
/*        Arrays.setAll(arr, new IntToDoubleFunction() {@Overridepublic double applyAsDouble(int value) {return arr[value] * 0.8;}});*///第二代的样子
/*        Arrays.setAll(arr, (int value) ->{return arr[value] * 0.8;});*///第三代的样子Arrays.setAll(arr,value ->arr[value] * 0.8 );System.out.println(Arrays.toString(arr));}
}

运行结果如下:

        此时你是不是嘴巴都张大了? 正常,当时的我也是这样的。其实这还不最简化的表达式,还可以更加深入简化!!!这就是好奇心推动我们不断学习的源源不断的动力!

                                                ​​​​​​​本篇先介绍到这!!! 



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

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

相关文章

【腾讯云 HAI域探秘】——自行搭建Stable Diffusion模型服务用于生成AI图片 | 自行搭建ChatGL M26BAI模型服务用于AI对话 | Pytorch2.0 AI框架视频处理

自行搭建Stable Diffusion模型服务用于生成AI图片 一、服务创建 1、服务地址&#xff1a; 高性能应用服务HAI 新品内测 2、等待审核(大概24小时) 二、创建服务 1、新建服务 2、选择AI模型&#xff1a;Stable Diffusion 高性能&#xff0c;效率更快。 3、等待创建(5~8分钟&a…

一文带你深入浅出Web的自动化测试工具Selenium【建议收藏】

文章目录 前言第01节 Selenium概述第02节 安装浏览器驱动&#xff08;以Google为例&#xff09;第03节 定位页面元素1. 打开指定页面2. id 定位3. name 定位4. class 定位5. tag 定位6. xpath 定位7. css 选择器8. link 定位9. 示例 有道翻译 第04节 浏览器控制1. 修改浏览器窗…

【YOLOX简述】

YOLOX的简述 一、 原因1. 背景2. 概念 二、 算法介绍2.1 YOLOX算法结构图&#xff1a;2.2 算法独特点2.3 Focus网络结构2.4 FPN&#xff0c;PAN2.5 BaseConv2.6 SPP2.7 CSPDarknet2.8 YOlO Head 三、预测曲线3.1 曲线 一、 原因 1. 背景 工业的缺陷检测是计算机视觉中不可缺少…

AI集成ChatGPT敲代码神器Copilot

&#x1f4d1;前言 本文主要是AI工具Copilot解读文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

基于springboot的医护人员排班系统 全套代码 全套文档

基于springboot的医护人员排班系统,springboot vue mysql (毕业论文10411字以上,共27页,程序代码,MySQL数据库) 代码下载链接&#xff1a;https://pan.baidu.com/s/177HdCGtTvqiHP4O7qWAgxA?pwd0jlf 提取码&#xff1a;0jlf 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue …

【Java】智慧工地管理系统源码(SaaS模式)

智慧工地是聚焦工程施工现场&#xff0c;紧紧围绕人、机、料、法、环等关键要素&#xff0c;综合运用物联网、云计算、大数据、移动计算和智能设备等软硬件信息技术&#xff0c;与施工生产过程相融合。 一、什么是智慧工地 智慧工地是指利用移动互联、物联网、智能算法、地理信…

基础课5——垂直领域对话系统架构

垂直领域对话系统是指针对特定领域或行业的需求而构建的对话系统。这种系统通常需要具备高度的专业知识和对特定领域的知识库进行深入的学习和训练&#xff0c;以便能够提供准确、高效、实用的服务。 垂直领域对话系统的构建通常包括以下步骤&#xff1a; 确定目标领域或行业…

【社会网络分析第5期】gephi使用指南

gephi数据可视化 gephi数据可视化1、软件安装2、数据处理与导入&#xff08;1&#xff09;导入节点&#xff08;2&#xff09;导入边&#xff08;3&#xff09;改变节点的颜色&#xff08;4&#xff09;根据pagerank调整节点的大小&#xff08;5&#xff09;根据pagerank调整边…

【微服务专题】Spring启动过程源码解析

目录 前言阅读对象阅读导航前置知识笔记正文一、SpringBoot启动过程源码解析1.1 SpringBoot启动过程源码流程图1.2 流程解析补充1.2.1 SpringApplicationRunListeners&#xff1a;SpringBoot运行过程监听器 学习总结感谢 前言 这部分只是个人的自结&#xff0c;方便后面回来看…

demo(一)eureka----服务注册与提供

下面写一个简单的demo验证下eureka&#xff0c;实现服务注册、服务发现。 一、单节点&#xff1a; 1、api&#xff1a; 封装其他组件需要共用的dto 2、eureka-service服务注册中心&#xff1a; &#xff08;1&#xff09;pom: <?xml version"1.0" encoding&q…

考研分享第2期 | 中央财经大学管理科学跨考北大软微金融科技406分经验分享

一、个人信息 本科院校&#xff1a;中央财经大学 管理科学与工程学院 管理科学专业 上岸院校&#xff1a;北京大学 软件与微电子学院 金融科技专业硕士 考试科目&#xff1a; 初试&#xff1a;思想政治理论 英语一 数学二 经济学综合 面试考察范围广&#xff0c;包括英语自…

【机器学习9】前馈神经网络

深度前馈网络是一类网络模型的统称&#xff0c;主要包括多层感知机、 自编码器、限制玻尔兹曼机&#xff0c; 以及卷积神经网络等。 1 激活函数 激活函数及对应导函数图其它Sigmoid 导数 在z很大或很小时都会趋近于0&#xff0c; 造成梯度消失的现象Tanh 其导数在z很大或很小…

客户管理系统升级,助力企业快速增长——API线索对接功能

在数字化时代&#xff0c;企业需要迅速适应不断变化的市场需求&#xff0c;实现高效的客户管理&#xff0c;以便迅速发现商机并提供更好的客户体验。为了助力企业取得成功&#xff0c;客户管理系统的API线索对接功能应运而生&#xff0c;带来更多机会、更高效率以及更全面的客户…

WebStorm配置less编译wxss或css

文章目录 前言先下载安装less程序&#xff1a;实参&#xff1a;要刷新的输出路径成功 前言 使用WebStorm写微信小程序&#xff0c;wxss写着很麻烦&#xff0c;就想着用less&#xff0c;接下来是配置less编译 先下载安装less npm install -g lessless会安装在你当前目录下(以D…

springboot苍穹外卖实战:十、缓存菜品(手动用redisTemplate实现缓存逻辑)+缓存套餐(Spring cache实现)

缓存菜品 缺点 缓存和数据库的数据一致性通常解决方案&#xff1a;延时双删、异步更新缓存、分布式锁。 该项目对于缓存菜品的处理较为简单&#xff0c;实际可以用管道技术提高redis的操作效率、同时cache自身有注解提供使用。 功能设计与缓存设计 建议这部分去看下原视频&…

在Spring Boot中使用进程内缓存和Cache注解

在Spring Boot中使用内缓存的时候需要预先知道什么是内缓存&#xff0c;使用内缓存的好处。 什么是内缓存 内缓存&#xff08;也称为进程内缓存或本地缓存&#xff09;是指将数据存储在应用程序的内存中&#xff0c;以便在需要时快速访问和检索数据&#xff0c;而无需每次都从…

(四)什么是Vite——冷启动时vite做了什么(源码、middlewares)

vite分享ppt&#xff0c;感兴趣的可以下载&#xff1a; ​​​​​​​Vite分享、原理介绍ppt 什么是vite系列目录&#xff1a; &#xff08;一&#xff09;什么是Vite——vite介绍与使用-CSDN博客 &#xff08;二&#xff09;什么是Vite——Vite 和 Webpack 区别&#xff0…

Uniapp-小程序自定义导航栏

一、项目背景 制作小程序页面时候发现原生导航栏有一定的高度是没有背景渲染的会出现这种情况 但是我们需要的是 二、原因 小程序的原生导航栏存在。一般可以使用 纯色填充顶部栏 可以直接使用navigationBarBackgroundColor完成 在style中添加 "navigationBarBackgrou…

深入了解域名与SSL证书的关系

在如今数字化的世界里&#xff0c;网络安全成为我们关注的重要议题之一。为了确保数据在网络上传输的安全性&#xff0c;我们通常会采取各种安全措施&#xff0c;其中最常用的就是SSL证书。然而&#xff0c;很多人并不了解SSL证书是如何与域名相互关联的。 首先&#xff0c;我…

Pytorch自动混合精度的计算:torch.cuda.amp.autocast

1 autocast介绍 1.1 什么是AMP? 默认情况下&#xff0c;大多数深度学习框架都采用32位浮点算法进行训练。2017年&#xff0c;NVIDIA研究了一种用于混合精度训练的方法&#xff0c;该方法在训练网络时将单精度&#xff08;FP32&#xff09;与半精度(FP16)结合在一起&#xff…