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!");}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45612.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】Ubuntu 漏洞掃描與修復的吃癟經歷

自從上次“劫持”事情后&#xff0c;項目經理將所有跟安全相關的都推給我了&#xff08;不算 KPI 又要被白嫖&#xff0c;煩死了&#xff09;。這次客戶又提了一個服務器安全掃描和漏洞修復的“活”&#xff0c;我這邊順手將過程記錄一下&#xff0c;就當經驗總結跟各位分享一下…

centos7安裝配置maven

一、配置安裝環境 #安裝wget yum install -y wget #安裝jdk17 #創建jdk存放目錄 mkdir -p /usr/local/java #切換目錄 cd /usr/local/java #下載jdk17 wget https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_b…

【Linux】多線程_7

文章目錄 九、多線程8. POSIX信號量根據信號量環形隊列的生產者消費者模型代碼結果演示 未完待續 九、多線程 8. POSIX信號量 POSIX信號量和SystemV信號量作用相同&#xff0c;都是用于同步操作&#xff0c;達到無沖突的訪問共享資源目的。 但POSIX可以用于線程間同步。 創建…

什么ISP?什么是IAP?

做單片機開發的工程師經常會聽到兩個詞&#xff1a;ISP和IAP&#xff0c;但新手往往對這兩個概念不是很清楚&#xff0c;今天就來和大家聊聊什么是ISP&#xff0c;什么是IAP&#xff1f; 一、ISP ISP的全稱是&#xff1a;In System Programming&#xff0c;即在系統編程&…

如何申請抖音本地生活服務商?3種方式優劣勢分析!

隨著多家互聯網大廠在本地生活板塊的布局力度不斷加大&#xff0c;以抖音為代表的頭部互聯網平臺的本地生活服務商成為了創業賽道中的大熱門&#xff0c;與抖音本地生活服務商怎么申請等相關的帖子&#xff0c;更是多次登頂創業者社群的話題榜單。 就目前的市場情況來看&#x…

Go語言--廣播式并發聊天服務器

實現功能 每個客戶端上線&#xff0c;服務端可以向其他客戶端廣播上線信息&#xff1b;發送的消息可以廣播給其他在線的客戶支持改名支持客戶端主動退出支持通過who查找當前在線的用戶超時退出 流程 變量 用戶結構體 保存用戶的管道&#xff0c;用戶名以及網絡地址信息 typ…

ARM功耗管理之功耗數據與功耗收益評估

安全之安全(security)博客目錄導讀 思考&#xff1a;功耗數據如何測試&#xff1f;功耗曲線&#xff1f;功耗收益評估&#xff1f; UPF的全稱是Unified Power Format&#xff0c;其作用是把功耗設計意圖&#xff08;power intent&#xff09;傳遞給EDA工具&#xff0c; 從而幫…

vscode OpenCV環境搭建

cmake 官網https://cmake.org/files/ 環境變量D:\Program Files\CMake\bin w64devkit 官網https://github.com/skeeto/w64devkit/tags 環境變量D:\Program Files\w64devkit\bin minGW32-make 拷貝并重命名為make OpenCV 在執行完后&#xff0c;把關于python的都給取消勾選…

mybatis-plus映射mysql的json類型的字段

一、對json里面內容建立實體類 Data AllArgsConstructor NoArgsConstructor public class RouteMetaEntity {private String title;private Boolean affix;private Boolean isAlwaysShow; }二、主類做映射 TableField(typeHandler JacksonTypeHandler.class)private RouteMe…

Codeforces Round 958 (Div. 2)補題

文章目錄 A題 (拆分多集)B題(獲得多數票)C題&#xff08;固定 OR 的遞增序列&#xff09; A題 (拆分多集) 本題在賽時卡的時間比較久&#xff0c;把這題想復雜了&#xff0c;導致WA了兩次。后來看明白之后就是將n每次轉換成k-1個1&#xff0c;到最后分不出來k-1個1直接一次就能…

Hive的基本操作(查詢)

1、基礎查詢 基本語法 select 字段列表|表達式|子查詢 from 表(子查詢|視圖|臨時表|普通表) where [not] 條件A and|or 條件B --先&#xff1a;面向原始行進行篩選 group by 字段A[,字段B,...] > 分組【去重處理】 having 聚合條件(非原始字段條件) --再&#x…

JMeter案例分享:通過數據驗證的錯誤,說說CSV數據文件設置中的線程共享模式

前言 用過JMeter參數化的小伙伴&#xff0c;想必對CSV Data Set Config非常熟悉。大家平時更關注變量名稱&#xff0c;是否忽略首行等參數&#xff0c;其余的一般都使用默認值。然而我最近遇到一個未按照我的預想讀取數據的案例&#xff0c;原因就出在最后一個參數“線程共享模…

深度學習中激活函數的演變與應用:一個綜述

摘要 本文全面回顧了深度學習中激活函數的發展歷程,從早期的Sigmoid和Tanh函數,到廣泛應用的ReLU系列,再到近期提出的Swish、Mish和GeLU等新型激活函數。深入分析了各類激活函數的數學表達、特點優勢、局限性以及在典型模型中的應用情況。通過系統的對比分析,本文探討了激…

樹莓派配置vsftpd主動模式

sudo apt-get install vsftpd /etc/vsftpd.conf anonymous_enableNO # 禁用匿名用戶 local_enableYES # 允許本地用戶登錄 write_enableYES # 允許修改權限 #chroot_local_userYES # 將用戶限制在其主目錄 systemctl restart vsftpd sudo adduser ftpuser sudo pa…

詳解MySQL中的遞歸查詢

MySQL中的遞歸查詢主要通過WITH RECURSIVE語句來實現&#xff0c;這在處理具有層級關系或樹形結構的數據時非常有用。下面將通過一個具體的例子來詳細解釋如何在MySQL中使用遞歸查詢。 示例場景 假設我們有一個部門表&#xff08;departments&#xff09;&#xff0c;其中包含…

昇思訓練營打卡第二十五天(RNN實現情感分類)

RNN&#xff0c;即循環神經網絡&#xff08;Recurrent Neural Network&#xff09;&#xff0c;是一種深度學習模型&#xff0c;特別適用于處理序列數據。以下是對RNN的簡要介紹&#xff1a; RNN的特點&#xff1a; 記憶性&#xff1a;與傳統的前饋神經網絡不同&#xff0c;R…

老板新招的牛人,竟然用1天搭建了一套完整的倉庫管理系統!

倉儲管理系統是什么&#xff1f; 倉儲管理系統&#xff08;WMS&#xff09;是一個全面的軟件解決方案&#xff0c;旨在幫助企業優化倉庫管理流程、管理和控制日常倉庫運營。通過數學模型和信息手段&#xff0c;對倉庫管理的各個環節進行優化和調控&#xff0c;涵蓋了從貨物入庫…

使用網關和Spring Security進行認證和授權

個人名片 &#x1f393;作者簡介&#xff1a;java領域優質創作者 &#x1f310;個人主頁&#xff1a;碼農阿豪 &#x1f4de;工作室&#xff1a;新空間代碼工作室&#xff08;提供各種軟件服務&#xff09; &#x1f48c;個人郵箱&#xff1a;[2435024119qq.com] &#x1f4f1…

jquery發送jsonp請求

使用 jQuery 發送 JSONP 請求相對來說比較簡單&#xff0c;以下是示例代碼&#xff1a; $.ajax({url: "http://example.com/data",dataType: "jsonp",jsonp: "callback",jsonpCallback: "myCallback" }).done(function(response) {//…

Linux命令更新-sort 和 uniq 命令

簡介 sort 和 uniq 都是 Linux 系統中常用的文本處理命令。 sort 命令用于對文件內容進行排序。 uniq 命令用于去除文件中重復出現的行。 1. sort 命令 命令格式 sort [選項] [文件]選項&#xff1a; -n: 按照數字進行排序 -r: 反向排序 -c: 統計每個元素出現的次數 -…