java 之匿名内部类 与 Lambda 表达式

文章目录

      • Lambda 表达式:
        • 基本语法:
        • 例子:
      • 匿名内部类:
        • 语法:
        • 例子:
      • 对比:
      • 相似之处:
      • 区别:
      • 示例比较:

Lambda 表达式:

Lambda 表达式是 Java 8 引入的一项功能,用于简化函数式接口的实现。Lambda 表达式提供了一种更为简洁和可读的方式来编写匿名函数,尤其是在函数式编程和处理集合时。

基本语法:
(parameters) -> expression

或者

(parameters) -> { statements; }

Lambda 表达式的主要特点包括:

  1. 参数列表(parameters): 与方法的参数列表相似,可以包含零个或多个参数。
  2. 箭头符号(->): 表示从参数到表达式或语句的映射。
  3. 表达式(expression)或语句块(statements): 表达式是单一的返回值,而语句块可以包含多个语句,并且有自己的作用域。
例子:
// Lambda 表达式实现 Runnable 接口
Runnable runnable = () -> System.out.println("Hello, Lambda!");// Lambda 表达式实现 Comparator 接口
Comparator<String> comparator = (s1, s2) -> Integer.compare(s1.length(), s2.length());

匿名内部类:

匿名内部类是在声明和创建对象的同时定义类的一种方式。通常用于创建只需使用一次的简单类或接口的实例。

语法:
new InterfaceName() {// 类的成员和方法
}

匿名内部类的主要特点包括:

  1. 没有类名: 匿名内部类没有显式的类名,类的定义和实例的创建合并在一起。
  2. 实现接口或继承类: 可以直接实现接口或继承抽象类,并在花括号中提供具体的实现。
例子:
// 匿名内部类实现 Runnable 接口
Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello, Anonymous Inner Class!");}
};// 匿名内部类实现 Comparator 接口
Comparator<String> comparator = new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return Integer.compare(s1.length(), s2.length());}
};

对比:

  1. 语法: Lambda 表达式更为紧凑,语法更简洁。匿名内部类相对繁琐一些,需要使用关键字 new 和接口/类的名称。
  2. 作用域: Lambda 表达式和匿名内部类都可以访问外部变量,但有些细节上的差异,例如对于外部变量的访问是 final 还是 effectively final 等。

是的,匿名内部类和Lambda 表达式都是在 Java 中用于实现接口中的抽象方法的机制。虽然它们有一些相似之处,但也存在一些关键的区别。

相似之处:

  1. 实现接口的方式: 匿名内部类和Lambda 表达式都可以用于实现接口中的抽象方法。

  2. 单一抽象方法(SAM): 二者都通常用于实现只有一个抽象方法的接口,这样的接口被称为函数式接口。

区别:

  1. 语法:

    • 匿名内部类: 使用关键字 new 创建一个没有明确类名的实例,并在花括号中提供实现。语法相对冗长。
    • Lambda 表达式: 提供了更为紧凑的语法,不需要使用关键字 new,而是使用箭头 -> 定义参数和实现。
  2. 作用域:

    • 匿名内部类: 对于外部变量的访问,需要注意变量是 final 或 effectively final 的。变量在匿名内部类中具有封闭的作用域。
    • Lambda 表达式: 具有对外部变量的捕获(capturing),但它们对外部变量的访问要求变量是 final 或 effectively final。Lambda 表达式对变量的引用是在运行时进行的。
  3. 关键字:

    • 匿名内部类: 使用 new 关键字创建实例。
    • Lambda 表达式: 更简洁,直接使用参数和箭头符号。

示例比较:

匿名内部类实现 Runnable 接口:

Runnable runnable1 = new Runnable() {@Overridepublic void run() {System.out.println("Hello from Anonymous Inner Class!");}
};

Lambda 表达式实现 Runnable 接口:

Runnable runnable2 = () -> System.out.println("Hello from Lambda!");

在上述例子中,两者都实现了 Runnable 接口,分别使用匿名内部类和 Lambda 表达式。可以看到 Lambda 表达式更为紧凑,语法更为简洁。在实践中,Lambda 表达式通常用于实现简单的函数式接口,而匿名内部类则用于需要更复杂逻辑的场景。

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

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

相关文章

从文字下乡到人人学英语

从建国到改革开放&#xff0c;从恢复高考到新式教育改革&#xff0c;中国飞速发展&#xff0c;文字需求也在不断增大&#xff0c;在“地球村”的时代下&#xff0c;我们要“习文字之变&#xff0c;顺时代发展。” 古言道&#xff1a;“仓颉作书&#xff0c;后稷作稼”&#xff…

UE4 去除重复纹理

如果直接连的话&#xff0c;效果如下&#xff1a; 就存在很多重复的纹理&#xff0c;如何解决这个问题呢&#xff1f; 将同一个纹理&#xff0c;用不同的Tilling&#xff0c;将Noise进行Lerp两者之间&#xff0c;为什么要这么做呢&#xff1f;因为用一个做清晰纹理&#xff0c;…

Maven 项目的三种打包方式与 pom.xml 文件中项目描述

目录&#xff1a; 定义项目的信息 本项目描述相关标签<parent> 标签<relativePath/> 标签<scope> 标签 Maven 三种打包方式 JARWARPOM 原文链接 — —

获取JSON里面result的值 将(List数组或对象)转换出来并读取

列如&#xff1a;数据结构 //为虚构数据 仅参考{ "success" : TRUE,"message" : "操作成功&#xff01;","code" : 200,"result" :[{ "id" : 1,"ip" : "185.20.2","username" : &…

设计模式——命令模式

引言 命令模式是一种行为设计模式&#xff0c; 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中&#xff0c; 且能实现可撤销操作。 问题 假如你正在开发一款新的文字编辑器&#xff0c; …

request.getcontextPath() 详解

request.getcontextPath() 详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 走进Servlet世界&#xff1a;request.getcontextPath()详解 在Java Web开发中&am…

第15课 SQL入门之插入数据

文章目录 15.1 数据插入15.1.1 插入完整的行15.1.2 插入部分行15.1.3 插入检索出的数据 15.2 从一个表复制到另一个表 这一课介绍如何利用SQL的INSERT语句将数据插入表中。 15.1 数据插入 毫无疑问&#xff0c;SELECT是最常用的SQL语句了&#xff0c;这就是前14课都在讲它的原…

C语言—小小圣诞树

这个代码会询问用户输入圣诞树的高度&#xff0c;然后根据输入的高度在控制台上显示相应高度的圣诞树。 #include <stdio.h>int main() {int height, spaces, stars;printf("请输入圣诞树的高度: ");scanf("%d", &height);spaces height - 1;st…

Linux---远程登录、远程拷贝命令

1. 远程登录、远程拷贝命令的介绍 命令说明ssh远程登录scp远程拷贝 2. ssh命令的使用 ssh是专门为远程登录提供的一个安全性协议&#xff0c;常用于远程登录&#xff0c;想要使用ssh服务&#xff0c;需要安装相应的服务端和客户端软件&#xff0c;当软件安装成功以后就可以使…

串口通信(3)-C#串口类SerialPort详解

本文详解C#串口类SerialPort 目录 一、概述 二、构造函数及重载 三、字段InfiniteTimeout 四、属性 五

论文阅读《DPS-Net: Deep Polarimetric Stereo Depth Estimation》

论文地址&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/html/Tian_DPS-Net_Deep_Polarimetric_Stereo_Depth_Estimation_ICCV_2023_paper.html 概述 立体匹配模型难以处理无纹理场景的匹配&#xff0c;现有的方法通常假设物体表面是光滑的&#xff0c;或者光照是…

什么是容器编排?

什么是容器编排&#xff1f; 容器编排是一种能够自动管理容器的软件技术。这是现代云应用程序开发所必需的&#xff0c;因为应用程序可能在其各自的容器中包含数千项微服务。大量容器化微服务使软件开发人员无法手动管理它们。 容器编排的优势 开发人员使用容器编排工具自动…

express中实现将mysql中的数据导出为excel

express中实现将mysql中的数据导出为excel 安装node-excel cnpm install node-xlsx -S封装公用的导出方法 /*** 查询* param tableName: 表名* param sqlJson&#xff1a;需要拼接的SQL* returns {Promise<unknown>}*/ const find (tableName, sqlJson) > {return…

Linux——权限

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、 Linux下用户的分类 Linux下有两种用户&#xff1a; 1. root&#xff08;超级管理员用户…

【Docker】离线一键式安装docker、docker-compose

1.创建根目录(可随意) mkdir -p /docker2.上传文件 资源地址 [rootlocalhost docker]# tree /docker/ /docker/ ├── docker │ ├── docker-18.03.1-ce.tgz │ └── docker-compose-Linux-x86_64 ├── install-docker-compose.sh └── install-docker.sh3.安装…

基于FPGA的HDMI编码模块设计(包含工程源文件)

前文已经通过FPGA实现了TMDS视频编码的算法&#xff0c;也对单沿数据采样转双沿数据采样的ODDR原语做了详细讲解和仿真验证&#xff0c;本文将这些模块结合&#xff0c;设计出HDMI编码模块&#xff0c;在HDMI接口的显示器上显示一张图片。 1、整体思路 如图1所示&#xff0c;是…

Github 2023-12-18 开源项目周报 Top14

根据Github Trendings的统计&#xff0c;本周(2023-12-18统计)共有14个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目4Python项目4Jupyter Notebook项目3非开发语言项目1JavaScript项目1Rust项目1Go项目1 基于项目…

【5G PHY】5G小区类型、小区组和小区节点的概念介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

剑指 Offer(第2版)面试题 37:序列化二叉树

剑指 Offer&#xff08;第2版&#xff09;面试题 37&#xff1a;序列化二叉树 剑指 Offer&#xff08;第2版&#xff09;面试题 37&#xff1a;序列化二叉树解法1&#xff1a;深度优先搜索 剑指 Offer&#xff08;第2版&#xff09;面试题 37&#xff1a;序列化二叉树 题目来源…

运算常见问题

运算常见问题 浮点数常见问题 1.double类型计算问题 首先我们看一下double类型的数据&#xff0c;计算会出现什么问题&#xff1f; public static void main(String[] args) {double amount1 0.1;double amount2 1.2;System.out.println(amount2 - amount1);} 上边程序的…