Lamda表达式和匿名内部类

文章目录

  • 前言
  • 一、匿名内部类是什么?
    • 1.实现接口和抽象类(普通类也可以)
    • 2.可实现接口或继承抽象类:
    • 3. 访问外部变量:
  • 二、Lambda表达式
    • 1.语法
    • 三.区别:
  • 总结


前言

`匿名内部类和抽象类总是往,现在来写一篇文章

一、匿名内部类是什么?

匿名内部类是一种在 Java 中用于创建临时、一次性对象的特殊语法。允许你在需要一个类的实例的地方,直接通过类的实例化来创建一个对象。匿名内部类通常用于实现接口或继承抽象类的情况。

1.实现接口和抽象类(普通类也可以)

InterfaceName obj = new InterfaceName() {
    // 匿名内部类的实现
    // 可以包含字段、方法的实现等
};

AbstractClassName obj = new AbstractClassName() {
    // 匿名内部类的实现
    // 可以包含字段、方法的实现等
};

特点和注意事项:一次性使用: 匿名内部类通常用于一次性的情况,不需要为其定义具体的类名,只需提供实现。

public class AnonymousClassExample {
    public static void main(String[] args) {
        // 第一次使用匿名内部类
        Task task1 = new Task() {
            @Override
            public void execute() {
                System.out.println("Task 1 executed");
            }
        };
        task1.execute();

        // 第二次使用匿名内部类
        Task task2 = new Task() {
            @Override
            public void execute() {
                System.out.println("Task 2 executed");
            }
        };
        task2.execute();
    }
}

在上述例子中,每次需要执行一个任务时,都要创建一个新的匿名内部类的实例。这两个任务的逻辑虽然相似,但它们是两个不同的匿名内部类实例。

如果要复用逻辑,可以考虑使用具名内部类或独立的类。例如:

public class NamedInnerClassExample {
    static class MyTask implements Task {
        @Override
        public void execute() {
            System.out.println("Task executed");
        }
    }

    public static void main(String[] args) {
        Task task1 = new MyTask();
        task1.execute();

        Task task2 = new MyTask();
        task2.execute();
    }
}

2.可实现接口或继承抽象类:

可以通过匿名内部类实现接口或继承抽象类,并在其中提供具体的实现。

3. 访问外部变量:

匿名内部类可以访问外部的 final 变量,但如果要修改外部变量,该变量必须是 final 的。

public class AnonymousClassExample {
    public static void main(String[] args) {
        final int externalVariable = 10; // 外部方法的局部变量,必须是 final 或事实上 final

        // 匿名内部类访问外部变量
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("External variable: " + externalVariable);
            }
        };

        // 执行匿名内部类的 run 方法
        myRunnable.run();
    }
}

不过从Java 8开始,引入了"effectively final"的概念,即如果一个局部变量在初始化后没有再次赋值,它被视为final,即使没有显式使用final关键字。这样,你可以在匿名内部类中访问这些局部变量,而无需显式将它们声明为final。
在这里插入图片描述
1.PriorityQueue<int[]> pq: 创建一个泛型为整数数组的优先队列。

2.new Comparator<int[]>() {…}: 创建一个匿名内部类,实现了 Comparator 接口,用于定义数组元素之间的比较规则。

3.public int compare(int[] a, int[] b) {return a[0] - b[0];}: 在匿名内部类中,实现了 compare 方法,该方法定义了两个整数数组 a 和 b 之间的比较规则。这里使用 a[0] - b[0] 表示比较两个数组的第一个元素

二、Lambda表达式

它允许在更简洁、更便捷的方式下创建匿名函数。Lambda 表达式的主要目的是为了提供一种更紧凑的语法来表示函数式接口

1.语法

(parameters) -> expression

(parameters) -> { statements; }

实例
无参数实例

() -> System.out.println("Hello, Lambda!");

  有参数实例;
(int x, int y) -> x + y

(int x, int y) -> {
    int sum = x + y;
    System.out.println("Sum: " + sum);
    return sum;
}

三.区别:

Lambda 表达式和匿名内部类都可以用于创建函数式接口的实例,但有一些语法上的差异,主要在于语法的简洁性。

比如,对比使用匿名内部类和 Lambda 表达式实现 Runnable 接口:

// 使用匿名内部类
Runnable runnable1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, Anonymous Inner Class!");
    }
};

// 使用 Lambda 表达式
Runnable runnable2 = () -> System.out.println("Hello, Lambda!");

总结

好了,blog到此为止了,不要再忘记了😢😢😢😢

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

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

相关文章

如何用DevEcoStudio创建本地模拟器

第一步&#xff1a;打开devEcoStudio 工具 第二步&#xff1a;点击IDE 右上角previewer - Device Manager 第三步&#xff1a;选择Local Emulator 的tab &#xff0c;如果要创建的设备类型为Phone 选中即可 第四步&#xff1a;点击界面的右下角 New Emulator 第五步&#xff…

ansible的脚本---playbook剧本

ansible的脚本---playbook剧本 playbook组成部分 1、tasks任务&#xff1a;包含要在目标主机上执行的操作&#xff0c;使用模块定义这些操作&#xff0c;每个任务都是一个模块的调用 2、varlables变量&#xff1a;存储和传递数据&#xff0c;变量可以自定义&#xff0c;可以…

Android 大版本升级变更截图方法总结

Android 大版本升级变更截图方法总结 一、Android R (11) 平台二、Android S (12) 平台三、Android U (14) 平台 Android 原生的截屏功能是集成在 SystemUI 中&#xff0c;因此我们普通应用想要获取截图方法&#xff0c;就需要研读下 SystemUI 截屏部分的功能实现。 一、Androi…

Java--包,访问修饰符,多态数组,==和equals,hashcode,toString

包 同一个包里面不能有重复的类&#xff0c;不同的包可以有相同的类&#xff0c;包和包之间互不干涉。一个包下面有很多的类。 包的命名规则&#xff1a; 只能包含数字&#xff0c;字母&#xff0c;下划线&#xff0c;小圆点&#xff0c;但不能用数字开头&#xff0c;不能是关…

Databend 开源社区上榜 2023 年度 OSCHINA 优秀开源技术团队

2023 年 12 月 8 日&#xff0c;OSCHINA 对其平台上众多认证的官方技术团队和开源社区进行了全面评估&#xff0c;并颁发了“ 2023 年度优秀开源技术团队”奖项&#xff0c;以表彰各团队在推动中国开源生态系统发展方面所展现的创新能力和显著贡献。 在这一评选中&#xff0c;…

【开源软件】2022年最佳开源软件-排名第一:AlmaLinux

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

网络编程 DAY6 作业

1.使用数据库创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资 2.添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3.修改某一个人的薪资&#xff08;确定的一个&#xff09; 4.展示出工资在10000到…

C++ Qt开发:StringListModel字符串列表映射组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QStringListModel字符串映射组件的常用方法及…

智慧工地一体化云平台APP源码:监管端、工地端、危大工程、智慧大屏、物联网、塔机、吊钩、升降机

智慧工地管理平台是依托物联网、互联网建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。 智慧工地源码技术说明 1.微服务架构JavaSpring Cloud UniApp MySql 2.支持多端展示&#xff08;PC端、手…

istio 认证:对等身份认证+服务请求认证

istio 中有两种不同的身份认证方式&#xff1a; 基于 mTLS 的对等身份认证 PeerAuthentication基于 JWT&#xff08;JSON Web Token&#xff09;令牌的服务请求认证 RequestAuthentication 对等身份认证 PeerAuthentication 概念 提供服务到服务的认证服务网格的主要场景就…

循环神经网络中的梯度消失或梯度爆炸问题产生原因分析

循环神经网络中&#xff0c;通过时间反向传播&#xff08;backpropagation through time&#xff0c;BPTT&#xff09;实际上是循环神经网络中反向传播技术的一个特定应用。 &#xff08;1&#xff09;它要求我们将循环神经网络的计算图以此展开一个时间步&#xff0c;以获得模…

Redis BitMap(位图)

这里是小咸鱼的技术窝&#xff08;CSDN板块&#xff09;&#xff0c;我又开卷了 之前经手的项目运行了10多年&#xff0c;基于重构&#xff0c;里面有要实现一些诸如签到的需求&#xff0c;以及日历图的展示&#xff0c;可以用将签到信息存到传统的关系型数据库&#xff08;MyS…

BBS项目--登录

BBS阶段性测试总要求 django登录报错 Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。 原因分析&#xff1a;出现这种情况在Windows中很常见&#xff0c;就是端口被占用 解决措施&#xff1a;这时我们只需改一下端口便可以了 登录前端页面(HTML…

网络技术基础与计算思维实验教程_3.2_无线局域网与以太网互连实验

实验内容 实验目的 实验原理 实验步骤 打开上一个实验的文件 切换到物理工作区 导航到城市家园 放置一台交换机 和两台台式机 直通线连接 把AP0链接到交换机的端口3上 切换回逻辑工作区 选择DHCP自动获取网络信息 PC1同样 然后 验证通信过程 laptop0和PC0 laptop1和PC1 验…

AcWing算法进阶课-1.1.2Dinic/ISAP求最大流

算法进阶课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 给定一个包含 n n n 个点 m m m 条边的有向图&#xff0c;并给定每条边的容量&#xff0c;边的容量非负。 图中可能存在重边和自环。求从点 S S S 到点 T T T 的最大流。 输入格式 第一行包…

CentOS6.10 卸载MySQL8.0.34升级至8.0.35

准备要更新的MySQL安装包,下载地址:MySQL :: Download MySQL Community Server 查看当前MySQL版本 备份数据库 mysqldump -uroot -p -B > /opt/backup/20231220_mysql.sql 检查备份文件 查看所有服务项: service --status-all 可以看到我们注册的MySQL服务是mysqld 停止…

2023年中国数据智能管理峰会(DAMS上海站2023)-核心PPT资料下载

一、峰会简介 数据已经成为企业的核心竞争力&#xff01;谁掌控数据、更好的利用数据、实现资产化&#xff0c;谁就会真正率先进入大数据时代。 1、数据智能管理趋势和挑战 在峰会上&#xff0c;与会者讨论了数据智能管理的最新趋势和挑战。随着数据量的不断增加&#xff0c…

FMCW雷达仿真:基于L形阵列4D点云获取

摘要&#xff1a;本期内容为3D点云目标获取的延续工作&#xff0c;在距离、速度、方位角估计的基础上&#xff0c;通过设计L型阵列结构&#xff0c;进一步实现目标俯仰角的估计&#xff0c;最终实现目标4-D点云的获取。首先&#xff0c;通过中频信号建立仿真信号模型&#xff0…

【Chrome】ERR_SSL_PROTOCOL_ERROR问题

文章目录 前言一、下载二、使用步骤总结 前言 Edge升级最新版后&#xff0c;有的https访问不了&#xff0c;报如下错误 发现新版Chrome以及Chromium内核访问nginx ssl时报错&#xff0c;顺着这个思路接着查看到大佬的结论&#xff1a;服务器nginx使用的openssl版本过低&#…

MyBatis关联查询(一、一对一查询)

MyBatis关联查询&#xff08;一、一对一查询&#xff09; 需求&#xff1a;查询账户信息&#xff0c;关联查询用户信息。 分析&#xff1a;因为一个账户信息只能供某个用户使用&#xff0c;所以从查询账户信息出发关联查询用户信息为一对一查询。 在第一个mybatis项目并读取数…