Kotlin:2.1.20 的新特性

一、概述

The Kotlin 2.1.20 release is here! Here are the main highlights:
Kotlin 2.1.20發布了,主要亮點如下:

  • K2 compiler updates: updates to the new kapt and Lombok plugins
  • Kotlin Multiplatform: new DSL to replace Gradle’s Application plugin
  • Kotlin/Native: support for Xcode 16.3 and a new inlining optimization
  • Kotlin/Wasm: default custom formatters, support for DWARF, and migration to Provider API
  • Gradle support: compatibility with Gradle’s Isolated Projects and custom publication variants
  • Standard library: common atomic types, improved UUID support, and new time-tracking functionality
  • Compose compiler: relaxed restrictions on @Composable functions and other updates
  • Documentation: notable improvements to the Kotlin documentation.

二、常見原子類型

在Kotlin 2.1.20中,我們在標準庫的Kotlin .concurrent.atomics包中引入了公共原子類型,為線程安全操作啟用了共享的、獨立于平臺的代碼。
通過消除跨源集復制原子相關邏輯的需要,這簡化了Kotlin Multiplatform項目的開發。

kotlin.concurrent.atomics包及其屬性是實驗性的。要選擇加入,使用@OptIn(ExperimentalAtomicApi::class)注釋或編譯器選項-opt-in=kotlin.ExperimentalAtomicApi。

下面是一個示例,展示了如何使用AtomicInt在多個線程中安全地計數已處理的項:

示例執行效果圖

在這里插入圖片描述

@OptIn(ExperimentalAtomicApi::class)
suspend fun testExperimentalAtomicApi() {var processedItems = AtomicInt(0)val totalItems = 100val items = List(totalItems) { "item$it" }// Splits the items into chunks for processing by multiple coroutinesval chunkSize = 20val itemChunks = items.chunked(chunkSize)// chunked函數 將List分割為指定大小的子數組(List),// itemChunks 5個數組,每個數組里有20個元素coroutineScope {for (chunk in itemChunks) {launch {for (item in chunk) {println("Processing $item in thread ${Thread.currentThread()}")processedItems.incrementAndFetch()}}}}println("processedItems = $processedItems")
}suspend fun main() {testExperimentalAtomicApi()
}

為了在Kotlin的原子類型和Java的Java .util.concurrent.atomic原子類型之間實現無縫的互操作性,API提供了. asjavaatomic()和. askotlinatomic()擴展函數。
在JVM上,Kotlin原子和Java原子在運行時是相同的類型,因此您可以在沒有任何開銷的情況下將Java原子轉換為Kotlin原子,反之亦然。

下面的例子展示了Kotlin和Java原子類型是如何協同工作的:

執行示例效果圖

在這里插入圖片描述


@OptIn(ExperimentalAtomicApi::class)
fun testExperimentalAtomicApi11(){// Converts Kotlin AtomicInt to Java's AtomicIntegerval kotlinAtomic = AtomicInt(24)val javaAtomic: AtomicInteger = kotlinAtomic.asJavaAtomic()println("轉換 Java atomic 原始 value: ${javaAtomic.get()}")// 轉換 Java atomic 原始 value: 24javaAtomic.incrementAndGet()println("轉換 Java atomic 后 自增1次 value: ${javaAtomic.get()}")// 轉換 Java atomic 后 自增1次 value: 25// Converts Java's AtomicInteger back to Kotlin's AtomicIntval kotlinAgain: AtomicInt = javaAtomic.asKotlinAtomic()println("轉換 Kotlin atomic 原始 value: ${kotlinAgain.load()}")//轉換 Kotlin atomic 原始 value: 25kotlinAgain.incrementAndFetch()println("轉換 Kotlin atomic 后 自增1次 value: ${kotlinAgain.load()}")// 轉換 Kotlin atomic 后 自增1次 value: 26}suspend fun main() {testExperimentalAtomicApi11()
}

三、UUID解析、格式和可比性的變化

JetBrains團隊繼續在2.0.20中改進對標準庫中引入的uuid的支持。

以前,parse()函數只接受十六進制和破折號格式的uuid。在Kotlin 2.1.20中,可以對十六進制-破折號和普通十六進制(不帶破折號)格式使用parse()。

在這個版本中,我們還引入了一些特定于十六進制和破折號格式操作的函數:

  • parseHexDash()從十六進制和破折號格式解析uid。
  • toHexDashString()將Uuid轉換為十六進制和破折號格式的String(鏡像toString()的功能)。

這些函數的工作方式類似于前面介紹的十六進制格式的parseHex()和toHexString()。解析和格式化功能的顯式命名應該會提高代碼的清晰度和您使用uid的總體體驗。

Kotlin中的uid現在是可比的。從Kotlin 2.1.20開始,您可以直接比較和排序Uuid類型的值。這允許使用<和>操作符和標準庫擴展,這些擴展專門用于Comparable類型或它們的集合(例如sorted()),并且它還允許將uuid傳遞給需要Comparable接口的任何函數或api。

請記住,標準庫中的UUID支持仍然是實驗性的。要選擇加入,使用@OptIn(ExperimentalUuidApi::class)注釋或編譯器選項-opt-in=kotlin.uuid.ExperimentalUuidApi::

執行示例效果圖

在這里插入圖片描述

@OptIn(ExperimentalUuidApi::class)
fun testExperimentalUuidApi(){// parse() accepts a UUID in a plain hexadecimal formatval uuid = Uuid.parse("550e8400e29b41d4a716446655440000")// Converts it to the hex-and-dash formatval hexDashFormat = uuid.toHexDashString()// Outputs the UUID in the hex-and-dash formatprintln(hexDashFormat)// 550e8400-e29b-41d4-a716-446655440000// Outputs UUIDs in ascending orderprintln(listOf(uuid,Uuid.parse("780e8400e29b41d4a716446655440005"),Uuid.parse("5ab88400e29b41d4a716446655440076")).sorted())// [550e8400-e29b-41d4-a716-446655440000, 5ab88400-e29b-41d4-a716-446655440076, 780e8400-e29b-41d4-a716-446655440005]
}fun main() {testExperimentalUuidApi()
}

四、新的時間跟蹤功能

從Kotlin 2.1.20開始,標準庫提供了表示某個時刻的能力。此功能以前僅在Kotlin官方庫kotlinx-datetime中可用。

kotlinx.datetime.Clock接口以kotlin.time.Clock的形式引入標準庫,kotlinx.datetime.Instant類以kotlin.time.Instant的形式引入標準庫。這些概念很自然地與標準庫中的時間包保持一致,因為與kotlinx-datetime中保留的更復雜的日歷和時區功能相比,它們只關注時間中的時刻。

當您需要精確的時間跟蹤而不考慮時區或日期時,Instant和Clock是有用的。例如,您可以使用它們來記錄帶有時間戳的事件,度量兩個時間點之間的持續時間,并獲得系統進程的當前時刻。

為了提供與其他語言的互操作性,可以使用額外的轉換器功能:

  • tokotlininstant()將時間值轉換為kotlin.time.Instant實例。
  • tojavainstant()將kotlin.time.Instant值轉換為java.time.Instant值。
  • Instant.toJSDate()將kotlin.time.Instant值轉換為JSDate類的一個實例。這種轉換并不精確;JS使用毫秒級的精度來表示日期,而Kotlin允許納秒級的分辨率。

標準庫的新時間特性仍處于試驗階段。要選擇加入,請使用@OptIn(ExperimentalTime::class)注釋:

執行示例效果圖

在這里插入圖片描述

@OptIn(ExperimentalTime::class)
fun testTimeClock() {// Get the current moment in timeval currentInstant = Clock.System.now()println("Current time: $currentInstant")// Find the difference between two moments in timeval pastInstant = Instant.parse("2023-01-01T00:00:00Z")val duration = currentInstant - pastInstantprintln("Time elapsed since 2023-01-01: $duration")
}
fun main() {testTimeClock()
}

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

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

相關文章

設計模式 | 觀察者模式

觀察者模式&#xff08;Observer Pattern&#xff09;是行為型設計模式中的事件通知專家&#xff0c;它定義了對象間一種一對多的依賴關系&#xff0c;當一個對象狀態改變時&#xff0c;所有依賴它的對象都會自動收到通知并更新。這種模式實現了發布-訂閱機制&#xff0c;是事件…

Apache Struts2 遠程命令執行漏洞(S2-052)

一、漏洞概述 S2-052 是 Apache Struts2 框架中一個高危的遠程代碼執行漏洞&#xff08;CVE-2017-9805&#xff09;&#xff0c;由安全研究人員于 2017 年發現并公開。該漏洞源于 Struts2 的 REST 插件在使用 XStream 組件處理 XML 反序列化時&#xff0c;未對用戶輸入的 XML 數…

RS觸發器Multisim電路仿真——硬件工程師筆記

目錄 1 RS觸發器基礎知識 1.1 工作原理 1.2 電路結構 1.3 特點 1.4 應用 1.5 設計考慮 1.6 總結 2 與非門實現基本RS觸發器 2.1 電路結構 2.2 工作原理 2.3 特點 2.4 總結 3 或非門實現基本RS觸發器 3.1 電路結構 3.2 工作原理 3.3 特點 3.4 總結 4 與非門實…

提示技術系列(12)——程序輔助語言模型

什么是提示技術&#xff1f; 提示技術是實現提示工程目標的具體技術手段&#xff0c;是提示工程中的“工具庫”。 什么又是提示工程&#xff1f; 提示工程是指通過設計、優化和迭代輸入到大語言模型&#xff08;LLM&#xff09;的提示&#xff08;Prompt&#xff09;&#xff…

明遠智睿H618:開啟多場景智慧生活新時代

在數字化浪潮的推動下&#xff0c;智能設備正深刻地改變著我們的生活方式。明遠智睿H618以其強大的功能和卓越的性能&#xff0c;在家庭娛樂、商業展示、教育培訓和智能家居控制等多個領域展現出巨大的應用潛力&#xff0c;開啟了多場景智慧生活的新時代。 家庭娛樂&#xff1…

探秘展銷編輯器:相較于傳統展銷的卓越優勢與甄選指南?

在競爭激烈的商業環境中&#xff0c;企業期望通過展銷活動提升品牌知名度、推廣產品和拓展市場&#xff0c;但傳統展銷方式存在諸多難題。一是場地限制&#xff0c;優質場地稀缺、租金貴、檔期緊&#xff0c;場地空間和布局也不一定合適;二是展示形式單一&#xff0c;多為靜態展…

第31篇:塊設備與字符設備管理深度解析(基于OpenEuler 24.03)

塊設備與字符設備管理深度解析&#xff08;基于OpenEuler 24.03&#xff09; 文章目錄 塊設備與字符設備管理深度解析&#xff08;基于OpenEuler 24.03&#xff09;一、設備基礎概念體系1.1 塊設備的核心特性與分類1.2 字符設備的流式數據模型1.3 設備標識系統&#xff1a;主設…

Django Channels WebSocket實時通信實戰:從聊天功能到消息推送

引言 在Web開發中&#xff0c;實時通信功能&#xff08;如在線聊天、實時通知、數據推送&#xff09;已成為許多應用的核心需求。傳統的HTTP協議由于其請求-響應模式的限制&#xff0c;無法高效實現實時通信。WebSocket作為一種全雙工通信協議&#xff0c;為實時Web應用提供了…

day52 神經網絡調參指南

目錄 隨機種子 內參的初始化 神經網絡調參指南 參數的分類 調參順序 初始化參數 batchsize的選擇 學習率調整 激活函數的選擇 損失函數的選擇 模型架構中的參數 正則化系數 其他補充 隨機種子 import torch import torch.nn as nn# 定義簡單的線性模型&#xf…

.NET9 實現斐波那契數列(FibonacciSequence)性能測試

在 .NET 平臺上實現 斐波那契數列 并使用 BenchmarkDotNet 進行性能測試&#xff0c;是評估不同算法實現方式性能表現的一種高效且標準化的方法。通過該方式&#xff0c;可以對比遞歸、迭代、記憶化遞歸以及結合高性能優化技術&#xff08;如 Span<T>、Memory<T> 和…

三、docker軟件安裝:gitlab,nexus,mysql8,redis,nacos,nginx

目錄 1.gitlab安裝 2.nexus安裝 (1)下載啟動 (2)設置中央倉庫遠程地址 (3)配置maven的settings.xml 3.mysql8安裝 4.redis安裝 5.nacos安裝 6.nginx安裝 1.gitlab安裝 #創建目錄 cd /usr/local/ mkdir docker cd docker/ mkdir gitlab_docker cd gitlab_docker…

【與AI+】SAP WEBGUI集成開發與SAP INTERNET服務的關系

前言&#xff1a;這是我的水水專欄第五篇文章&#xff0c;這個專欄呢&#xff0c;是放一些我向AI提問的問題&#xff0c;以及AI的回答。因為感覺真的好方便哈哈哈~ 我不是很確定我的專欄文章內容是否涉及版權&#xff0c;以及也不確定這些整合過的文字是否涉嫌抄襲&#xff0c…

淺談幾種js設計模式

JavaScript設計模式是開發中常用的一種解決方案&#xff0c;它們幫助開發者以一種更結構化、更易維護的方式編寫代碼。本文將深入介紹幾種常見的JavaScript設計模式&#xff0c;包括單例模式、工廠模式、觀察者模式和策略模式。 一、單例模式&#xff08;Singleton Pattern&am…

手寫 Vue 中虛擬 DOM 到真實 DOM 的完整過程

目錄 一、虛擬 DOM 的核心概念 二、虛擬 DOM 到真實 DOM 的流程 三、手寫虛擬 DOM 到真實 DOM 的實現 1. 定義虛擬 DOM 的結構&#xff08;VNode&#xff09; 2. 創建虛擬 DOM 轉真實 DOM 的函數 3. 掛載虛擬 DOM 到頁面 4. 更新虛擬 DOM 的過程&#xff08;Diff 算法簡化…

jmm--volatile

指令重排基礎概念 在現代處理器和編譯器為了提高程序執行效率&#xff0c;會對指令進行優化&#xff0c;其中一種優化方式就是指令重排序。在單線程環境下&#xff0c;指令重排序不會影響最終執行結果&#xff0c;因為處理器和編譯器會保證重排序后的執行結果與按照代碼順序執行…

【硬件開發】濾波電容的選擇:原理、計算與多電壓值應用實踐

濾波電容的選擇&#xff1a;原理、計算與多電壓值應用實踐 1. 引言 在現代電子系統中&#xff0c;穩定的電源供應是保證電路可靠運行的基礎。然而&#xff0c;電源線上往往不可避免地存在各種噪聲和紋波&#xff0c;這些干擾可能源自電源本身&#xff08;如整流后的脈動直流&…

【seismic unix數據生成-unif2】

Seismic Unix簡介 Seismic Unix&#xff08;SU&#xff09;是由科羅拉多礦業學院&#xff08;Colorado School of Mines&#xff09;開發的開源地震數據處理軟件包&#xff0c;專為地震勘探數據分析和研究設計。它提供了一系列命令行工具&#xff0c;支持從數據加載、處理到可…

【逆向思考 并集查找】P2391 白雪皚皚|省選-

本文涉及知識點 C并集查找 P2391 白雪皚皚 題目背景 “柴門聞犬吠&#xff0c;風雪夜歸人”&#xff0c;冬天&#xff0c;不期而至。千里冰封&#xff0c;萬里雪飄。空中刮起了鴨毛大雪。雪花紛紛&#xff0c;降落人間。 美能量星球&#xff08;pty 在 spore 上的一個殖民地…

一文講清楚React中setState的使用方法和機制

文章目錄 一文講清楚React中setState的使用方法和機制1. setState是什么2. setState方法詳解2.1 setState參數詳解2.2 setState同步異步問題2.2.1 setState異步更新2.2.2 setState同步更新 一文講清楚React中setState的使用方法和機制 1. setState是什么 React中&#xff0c;…

01_軟件卓越之道:功能性與需求滿足

引言 在軟件的世界里&#xff0c;功能性是產品與用戶之間的第一橋梁。一個軟件即使擁有華麗的界面和極致的性能&#xff0c;如果不能解決用戶的核心需求&#xff0c;也終將被市場淘汰。本文將深入探討如何確保軟件的功能性與用戶需求完美契合。 1. 需求理解&#xff1a;從模糊…