进阶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(){
            @Override
            public void fun() {
                System.out.println("是只猫");
            }
        };

        Animal dog = new Animal() {
            @Override
            public 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(){
            @Override
            public void fun() {
                System.out.println("是只猫");
            }
        };*/
        //下面用Lambda表达式简化的代码跟上面的代码式等效的
        Animal cat = () -> {
                System.out.println("是只猫");
            };


/*        Animal dog = new Animal() {
            @Override
            public 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>() {
            @Override
            public 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() {
            @Override
            public 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() {
            @Override
            public 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.mfbz.cn/a/156124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL server从安装到入门(一)

文章目录 彻底安装怎么安装&#xff1f;Polybase要求安装orcale jre 7更新 51或更高版本&#xff1f;安装完怎么配置&#xff1f;没有SSMS&#xff1f; 熟悉一下SMSS&#xff01; 根据本人实际安装和初步使用SQL server的过程中&#xff0c;经历的一些关键性的步骤和精品文章。…

【volatality 3】使用说明文档

由于volatility2.6 和3.0 版本之间略有差异,所以特写本文档用来学习参考。 在vol3 中不需要指定profile,而是在命令中指定系统。 如windows.info、Windows.pslist 使用示例 文档说明 本文作者:SwBack 创作时间:‎2022‎年‎6‎月‎14‎日&#xff0c;‏‎15:47:05 知乎:https…

OPPO发布AndesGPT大模型;Emu Video和Emu Edit的新突破

&#x1f989; AI新闻 &#x1f680; OPPO发布全新ColorOS 14及自主训练的AndesGPT大模型 摘要&#xff1a;OPPO在2023 OPPO开发者大会上发布了全新的ColorOS 14&#xff0c;并正式推出了自主训练的安第斯大模型&#xff08;AndesGPT&#xff09;。AndesGPT拥有对话增强、个人…

集合贴——智能客服是什么

基础课1——智能客服的定义-CSDN博客文章浏览阅读166次。智能客服是一种采用人工智能技术的客户服务方式&#xff0c;它通过语音识别、自然语言处理、语义理解等技术&#xff0c;实现了与客户的自动交互。https://blog.csdn.net/2202_75469062/article/details/134406392?spm1…

为什么选择CodeEase?

目录 为什么选择CodeEase核心功能后端前端 框架结构总结 为什么选择CodeEase CodeEase是一个标准化的低代码平台 愿景 我们励志开发一站式服务&#xff0c;缩短网站开发周期&#xff0c;降低程序bug率&#xff0c;减少开发人力和成本&#xff0c;推出了多租户SaaS平台开发模板…

unity中的模型坐标系与3dmax导出的模型坐标系不一致的解决方案

unity中的模型坐标系与3dmax导出的模型坐标系不一致的解决方案 unity是左手坐标系&#xff0c;3dmax为右手坐标系 需要在3dmax中修改坐标系 顶视图中改成&#xff1a;X轴&#xff08;红色&#xff09;向右&#xff1a; Y轴&#xff08;蓝色&#xff09;朝向自己: Z轴&#xff…

码住!听我说护眼台灯这样选!

台灯的显色指数是其非常重要的指标&#xff0c;它可以表示灯光照射到物体身上&#xff0c;物体颜色的真实程度&#xff0c;一般用平均显色指数Ra来表示&#xff0c;Ra值越高&#xff0c;灯光显色能力越强。常见的台灯显色指数最低要求一般是在Ra80以上即可&#xff0c;比较好的…

机械人必须要了解的丝杆螺母参数

丝杆螺母是机械中重要的零部件之一&#xff0c;主要用于将旋转运动转化为直线运动&#xff0c;或者将直线运动转化为旋转运动。只有正确了解丝杆螺母的参数&#xff0c;才能进行选型。 1、螺纹规格&#xff1a;丝杆螺母的螺纹规格是按照国家标准进行分类的&#xff0c;常见的有…

CleanMyMac X2024免费苹果笔记本清理内存清理工具

CleanMyMac X的优点包括&#xff1a; 全面的系统清理&#xff1a;CleanMyMac X可以扫描和清理系统中的垃圾文件、缓存文件、无用的语言文件、残留文件等&#xff0c;从而释放磁盘空间&#xff0c;提高系统性能。 优化工具&#xff1a;该软件还提供了一系列优化工具&#xff0c…

Linux下好玩有趣的指令(持续更新)

适用于centOS下&#xff0c;别的Linux换个指令就行&#xff0c;内容是一样的 centOS有的指令安装不了&#xff1f;试试拓展yum源&#xff0c;再安装基本就OK啦&#xff01; yum install -y epel-release 下面是作者在centOS环境下亲测可以使用的&#xff0c;如果你是root用户直…

网络运维Day19

文章目录 环境准备数据备份为什么要备份什么是备份备份到哪里什么时候备份如何备份 完整备份物理备份逻辑备份测试恢复所有库 构建MySQL服务xtrabackup完全备份与恢复完全备份完全恢复增量备份增量恢复 总结 环境准备 IP地址采用自动分配&#xff0c;以自己的为准 可以将之前的…

几种典型的深度学习算法:(CNN、RNN、GANS、RL)

以下是几种典型的深度学习算法&#xff1a; 1、卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;&#xff1a;主要用于图像和视频等视觉任务。通过使用卷积层、池化层和全连接层等不同类型的神经网络层&#xff0c;CNN 可以学习图像中的特征并…

VMware17虚拟机Linux安装教程(详解附图,带VMware Workstation 17 Pro安装)

一、安装 VMware 附官方下载链接&#xff08;VM 17 pro&#xff09;&#xff1a;https://download3.vmware.com/software/WKST-1701-WIN/VMware-workstation-full-17.0.1-21139696.exe 打开下载好的VMware Workstation 17 Pro安装包&#xff1b; 点击下一步&#xff1b; 勾选我…

【微信小程序开发】小程序的事件处理和交互逻辑(最详细)

前言 在微信小程序中&#xff0c;事件处理和交互逻辑是开发过程中非常重要的环节&#xff0c;它们直接影响到用户体验和功能实现。今天为大家继续详解小程序的事件处理和交互逻辑 文章目录 前言为什么要学习事件处理和交互逻辑&#xff1f;事件处理基础事件类型和触发条件事件绑…

轻松搭建个人web站点:OpenWRT教程结合内网穿透技术实现公网远程访问

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器&#xff0c;目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器&#xff0c;并且和…

代码随想录算法训练营第五十四天丨 动态规划part15

392.判断子序列 思路 &#xff08;这道题也可以用双指针的思路来实现&#xff0c;时间复杂度也是O(n)&#xff09; 这道题应该算是编辑距离的入门题目&#xff0c;因为从题意中我们也可以发现&#xff0c;只需要计算删除的情况&#xff0c;不用考虑增加和替换的情况。 所以…

Android Termux安装MySQL,通过内网穿透实现公网远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f516;系列专栏&#xff1a; C语言、Linux、Cpolar ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前…

互联网+智慧河道大数据一体化管理平台解决方案:PPT43页,附下载

关键词&#xff1a;售前方案工程师&#xff0c;解决方案工程师&#xff0c;技术转售前&#xff0c;技术转售前的优势&#xff0c;软件工程师转售前 一、智慧水务大数据一体化建设背景 1、当前我国供水管网迅速扩张&#xff0c;管理压力加大&#xff0c;供水管网漏损率比较高&…

2023年中国超声波治疗仪发展趋势分析:中高端市场国产化率将稳步上升[图]

超声波治疗机是运用超声波治疗疾病的医用设备。主要由电源&#xff0c;高频振荡电路、超声波能治疗头组成。治疗时应正确掌握超声输出强度、治疗时间和选择不同的工作方式。目前超声波技术在医疗方面的独特疗效已得到医学界的普遍认可&#xff0c;且受到了越来越多临床重视和采…
最新文章