Lamda表达式和匿名内部类

2023-12-22 03:52
文章标签 表达式 匿名 内部 lamda

本文主要是介绍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() {@Overridepublic void execute() {System.out.println("Task 1 executed");}};task1.execute();// 第二次使用匿名内部类Task task2 = new Task() {@Overridepublic void execute() {System.out.println("Task 2 executed");}};task2.execute();}
}

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

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

public class NamedInnerClassExample {static class MyTask implements Task {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void run() {System.out.println("Hello, Anonymous Inner Class!");}
};// 使用 Lambda 表达式
Runnable runnable2 = () -> System.out.println("Hello, Lambda!");

总结

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

这篇关于Lamda表达式和匿名内部类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/522499

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变