当前位置: 首页 > news >正文

Java中常见的语法糖

文章目录

    • 概览
    • 泛型
    • 增强for循环
    • 自动装箱与拆箱
    • 字符串拼接
    • 枚举类型
    • 可变参数
    • 内部类
    • try-with-resources
    • Lambda表达式

概览

语法糖是指编程语言中的一种语法结构,它们并不提供新的功能,而是为了让代码更易读、更易写而设计的。语法糖使得某些常见的编程模式或操作变得更加简洁和直观,但在底层实现上,并没有引入新的语言特性或改变语言的表达能力。

尽管语法糖使得代码更加简洁和易读,但实际执行时,底层代码仍然需要遵循编程语言的基本语法和规则。在编译阶段,编译器将使用语法糖编写的高级语法转换为更基础、更原始的语法结构,便于生成相应的目标代码,如字节码或机器码,这就是解语法糖的过程。这个过程确保了最终执行的代码在语义上与原始的语法糖一致,同时能够在目标环境中正确运行。Java编译器的desugar()方法负责这个过程,这个过程确保了Java语言的高级特性可以在不增加JVM复杂性的情况下实现,从而提高了开发效率和代码可读性。

举例来说,假设有如下的Java语法糖:

List<String> list = new ArrayList<>();
list.add("Hello");
String s = list.get(0);

在这段代码中,泛型<String>是语法糖。编译器在编译这段代码时,会将其转换为如下的基础语法:

List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0);

泛型

泛型允许类、接口和方法在声明时使用参数化类型,提供了编译时类型安全检查机制,避免了强制类型转换的麻烦。但Java中的泛型只在程序源代码中有效,在编译后的字节码中会自动用强制类型转换进行替代。也就是说,Java语言中的泛型机制其实就是一颗语法糖,

// 泛型示例
List<String> names = new ArrayList<>();
names.add("Alice");
String first = names.get(0);
// 解语法糖
List names = new ArrayList();
names.add("Alice");
String first = (String) names.get(0);

增强for循环

增强for循环用于遍历数组或集合,即要么是一个数组,要么实现了Iterable接口,与普通for循环相比,功能更强并且代码更简洁。

public static void main(String[] args) {String[] params = new String[]{"hello","world"};//增强for循环对象为数组for(String str : params){System.out.println(str);}List<String> lists = Arrays.asList("hello","world");//增强for循环对象实现Iterable接口for(String str : lists){System.out.println(str);}
}
// 解语法糖
public static void main(String[] args) {String[] params = new String[]{"hello", "world"};String[] lists = params;int var3 = params.length;//数组形式的增强for退化为普通forfor(int str = 0; str < var3; ++str) {String str1 = lists[str];System.out.println(str1);}List var6 = Arrays.asList(new String[]{"hello", "world"});Iterator var7 = var6.iterator();//实现Iterable接口的增强for使用iterator接口进行遍历while(var7.hasNext()) {String var8 = (String)var7.next();System.out.println(var8);}}

自动装箱与拆箱

自动装箱和自动拆箱是Java中的语法糖,用于简化基本数据类型和其对应包装类型之间的转换操作。当将基本数据类型赋值给对应的包装类型时,编译器会调用包装类型的valueOf()方法来创建一个包装对象,并将基本数据类型的值传递给这个方法。当需要使用包装类型对象中的值进行基本数据类型的操作时,编译器会自动调用包装类型对象的xxxValue()方法,将包装对象转换为对应的基本数据类型值。

Integer boxedNum = 10; // 自动装箱
int num = boxedNum; // 自动拆箱
// 解语法糖
Integer boxedNum = Integer.valueOf(10);
int num = boxedNum.intValue();

字符串拼接

拼接字符串最简单的方式就是直接使用符号"+“来拼接,其实“+”是Java提供的一个语法糖。字符串拼接使用”+"操作符,在编译时会被转换为StringBuilder操作。

String message = "Hello, " + name + "!";
// 解语法糖
StringBuilder sb = new StringBuilder();
sb.append("Hello, ");
sb.append(name);
sb.append("!");
String message = sb.toString();

枚举类型

枚举类型就是一些具有相同特性的类常量,在Java中类的定义使用class,枚举类的定义使用enum。但在Java的字节码结构中,其实并没有枚举类型,枚举类型只是一个语法糖,在编译完成后被编译成一个普通的类。这个类继承java.lang.Enum,并被final关键字修饰。

public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
// 解语法糖
public final class Day extends Enum<Day> {public static final Day MONDAY = new Day("MONDAY", 0);public static final Day TUESDAY = new Day("TUESDAY", 1);public static final Day WEDNESDAY = new Day("WEDNESDAY", 2);public static final Day THURSDAY = new Day("THURSDAY", 3);public static final Day FRIDAY = new Day("FRIDAY", 4);public static final Day SATURDAY = new Day("SATURDAY", 5);public static final Day SUNDAY = new Day("SUNDAY", 6);private final String name;private final int ordinal;private Day(String name, int ordinal) {this.name = name;this.ordinal = ordinal;}public String name() {return name;}public int ordinal() {return ordinal;}public static Day[] values() {return (Day[]) $VALUES.clone();}public static Day valueOf(String name) {return (Day) Enum.valueOf(Day.class, name);}private static final Day[] $VALUES = {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
}

可变参数

可变参数就是允许方法接受可变数量的参数。使用变长参数有两个条件,一是变长的那一部分参数具有相同的类型,二是变长参数必须位于方法参数列表的最后面。变长参数同样是Java中的语法糖,其内部实现是Java数组。

public void printNumbers(int... numbers) {}
// 解语法糖
public void printNumbers(int[] numbers) {}

内部类

内部类就是定义在一个类内部的类,之所以引入内部类是因为有些时候一个类只在另一个类中引用,我们不想让其在另外一个地方被使用。内部类可以在一个类内部定义,但在编译时会被转换为独立的类文件,并不是真正套在一个类的内部,而是分成两个类编译。

class Outer {class Inner {void display() {System.out.println("Inner class method");}}
}
// 解语法糖
class Outer {class Inner {final Outer outer;Inner(Outer outer) {this.outer = outer;}void display() {System.out.println("Inner class method");}}
}

try-with-resources

try-with-resources语句简化了资源管理,使得资源在使用后自动关闭,这个语法糖就能让代码及其简洁。原理是编译器把它转换成了try-catch-finally

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {String line = reader.readLine();System.out.println(line);
} catch (IOException e) {e.printStackTrace();
}
// 解语法糖
BufferedReader reader = null;
try {reader = new BufferedReader(new FileReader("file.txt"));String line = reader.readLine();System.out.println(line);
} catch (IOException e) {e.printStackTrace();
} finally {if (reader != null) {try {reader.close();} catch (IOException ex) {ex.printStackTrace();}}
}

Lambda表达式

Lambda表达式是Java中的一种语法糖,它提供了一种简洁地表示匿名函数的方法,在语法上的简洁性大大提升了代码的可读性和编写效率。在编译后,Lambda表达式会被转换为相应的匿名内部类形式。

Runnable r = () -> System.out.println("Hello, World!");
// 解语法糖
Runnable r = new Runnable() {@Overridepublic void run() {System.out.println("Hello, World!");}
};

相关文章:

Java中常见的语法糖

文章目录 概览泛型增强for循环自动装箱与拆箱字符串拼接枚举类型可变参数内部类try-with-resourcesLambda表达式 概览 语法糖是指编程语言中的一种语法结构&#xff0c;它们并不提供新的功能&#xff0c;而是为了让代码更易读、更易写而设计的。语法糖使得某些常见的编程模式或…...

数据库使用SSL加密连接

简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施&#xff0c;它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性&#xff0c;同时满足行业标准和法规要求&#xff0c;进而提升用户体验和信任度&#xff0c;为企业的数据安全和业务连续性…...

华为OD算法题汇总

60、计算网络信号 题目 网络信号经过传递会逐层衰减&#xff0c;且遇到阻隔物无法直接穿透&#xff0c;在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物 array[m][n]&#xff0c;二维数组代表网格地图 array[i][j]0&#xff0c;代表i行j列是空旷位置 a…...

服务器的rabbitmq的guest账号登不进去

要配置 RabbitMQ 允许 guest 账号从非 localhost 地址登录&#xff0c;需要执行以下步骤&#xff1a; 编辑 RabbitMQ 配置文件&#xff1a; 打开 RabbitMQ 的配置文件&#xff0c;通常位于 /etc/rabbitmq/rabbitmq.conf 或者 /etc/rabbitmq/rabbitmq-env.conf。如果这些文件不存…...

决策树(ID3,C4.5,C5.0,CART算法)以及条件推理决策树R语言实现

### 10.2.1 ID3算法基本原理 ### mtcars2 <- within(mtcars[,c(cyl,vs,am,gear)], {am <- factor(am, labels c("automatic", "manual"))vs <- factor(vs, labels c("V", "S"))cyl <- ordered(cyl)gear <- ordered…...

文心一言《使用手册》,文心一言怎么用?

一、认识文心一言 &#xff08;一&#xff09;什么是文心一言 文心一言是百度研发的 人工智能大语言模型产品&#xff0c;能够通过上一句话&#xff0c;预测生成下一段话。 任何人都可以通过输入【指令】和文心一言进行对话互动、提出问题或要求&#xff0c;让文心一言高效地…...

Spring Boot集成qwen:0.5b实现对话功能

1.什么是qwen:0.5b&#xff1f; 模型介绍&#xff1a; Qwen1.5是阿里云推出的一系列大型语言模型。 Qwen是阿里云推出的一系列基于Transformer的大型语言模型&#xff0c;在大量数据&#xff08;包括网页文本、书籍、代码等&#xff09;进行了预训练。 硬件要求&#xff1a;…...

GreenDao实现原理

GreenDao 是一款针对 Android 平台优化的轻量级对象关系映射 (ORM) 框架&#xff0c;它将 Java 对象映射到 SQLite 数据库&#xff0c;以简化数据持久化操作。GreenDao 的主要优点包括高性能、低内存占用、易于使用以及对数据库加密的支持。 以下是基于源码的 GreenDao 实现原…...

Perl语言之数组

Perl数组可以存储多个标量&#xff0c;并且标量数据类型可以不同。   数组变量以开头。访问与定义格式如下&#xff1a; #! /usr/bin/perl arr("asdfasd",2,23.56,a); print "输出所有:arr\n"; print "arr[0]$arr[0]\n"; #输出指定下标 print…...

写材料word和PPT

一、WORD 1、写内容 2、参考GPT改&#xff1a;内容、逻辑结构、语句 3、查标题及其标号 4、修改格式&#xff1a;仿宋 、正文统一为小三&#xff0c;标题三号&#xff0c;1.5倍行距&#xff0c;加页码。 采用VBA代码自动修改&#xff0c;不知为何标题无法修改字体 Sub 插入页…...

Centos---命令详解 vi 系统服务 网络

目录 一、CentOS vi命令详解 二、CentOS系统服务命令 三、CentOS权限管理命令&#xff1a; 四、CentOS网络管理命令介绍&#xff1a; 一、CentOS vi命令详解 Vi是一款强大的文本编辑器&#xff0c;在CentOS中广泛使用。以下是Vi编辑器的一些常用命令&#xff1a; 1. 打开…...

【.NET全栈】ASP.NET开发web应用——ASP.NET中的样式、主题和母版页

文章目录 前言一、在ASP.NET中应用CSS样式1、创建CSS样式&#xff08;1&#xff09;内联样式&#xff08;2&#xff09;内部样式表&#xff08;3&#xff09;外部样式表 2、应用CSS样式&#xff08;1&#xff09;菜鸟教程-简单例子&#xff08;2&#xff09;菜鸟教程-用户界面&…...

[ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法

一、问题&#xff1a; 有时在 Postgres 上部署 Rails 应用程序时&#xff0c;可能会看到 ActiveRecord::PreparedStatementCacheExpired 错误。仅当在部署中运行迁移时才会发生这种情况。发生这种情况是因为 Rails 利用 Postgres 的缓存准备语句(PreparedStatementCache)功能来…...

函数传值面试题

let a {name: aa };function fun1(a) {a []; // 这里创建了一个新的局部变量a&#xff0c;它是一个空数组// a.name "芜湖" }fun1(a); // 调用fun1&#xff0c;传入a的引用副本 console.log(a); // 输出&#xff1a;{ name: aa }在 JavaScript 中&#xff0c;当你…...

redis笔记2

redis是用c语言写的,放不频繁更新的数据&#xff08;用户数据。课程数据&#xff09; Redis 中&#xff0c;"穿透"通常指的是缓存穿透&#xff08;Cache Penetration&#xff09;问题&#xff0c;这是指一种恶意或非法请求直接绕过缓存层&#xff0c;直接访问数据库或…...

Kafka(四) Consumer消费者

一&#xff0c;基础知识 1&#xff0c;消费者与消费组 每个消费者都有对应的消费组&#xff0c;不同消费组之间互不影响。 Partition的消息只能被一个消费组中的一个消费者所消费&#xff0c; 但Partition也可能被再平衡分配给新的消费者。 一个Topic的不同Partition会根据分配…...

前端路由手写Hash和History两种模式

文章目录 1. Hash模式&#xff1a;简洁而广泛适用2. History模式&#xff1a;更自然的用户体验3. 结论 在现代Web开发中&#xff0c;单页面应用&#xff08;Single Page Application&#xff0c;简称SPA&#xff09;因其流畅的用户体验和高效的页面交互能力而备受青睐。前端路由…...

Redis的单线程讲解与指令学习

目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现&#xff1f; 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中&#xff0c;有两个基本命令&#xff1…...

为什么MySQL会选择B+树作为索引

为什么MySQL会选择B树作为索引 在数据库管理系统中&#xff0c;索引是提升查询效率的关键技术之一。MySQL作为广泛使用的关系型数据库管理系统&#xff0c;其核心存储引擎InnoDB选择B树作为其索引结构&#xff0c;这一选择背后蕴含了深刻的性能和存储效率考量。本文将简要介绍…...

k8s secret-从环境变量里去读和从yaml文件里读取secret有什么区别?

从环境变量和YAML文件中读取Kubernetes Secret的区别主要体现在使用方式、动态更新能力以及管理便捷性上。以下是详细的区别说明&#xff1a; 1. **使用方式**&#xff1a; - **环境变量方式**&#xff1a;Kubernetes允许将Secret作为环境变量注入到Pod的容器中。这种方式的好处…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...