Kotlin 1.7.0 的首個預覽版現已發布,以下是 Kotlin 1.7.0-Beta 的一些亮點:
構建器推斷變更。
min() 和 max() 集合函數回歸。
絕對不可空類型得到穩定。
新版 Kotlin/Native 內存管理器更新。

從 1.7.0 開始,我們更新了我們的發布節奏術語:將「Milestone」(里程碑)更改為「Beta」(測試版)。這一決定背後有幾個原因:
我們希望 Kotlin 構建術語更加符合軟件發布周期的標準術語。更準確地說,「Beta」意味着我們向該特定版本中添加新功能的工作已經完成,並且正在致力於穩定工作。不過,我們也會實現最終變更,包括基於用戶反饋的變更。
前段時間,M-release 編譯器一直在生成「預發布」代碼,這使得這些版本更難測試。現在完全不一樣了。我們希望避免任何混淆,並強調試用 Kotlin Beta 版本的過程將十分簡單,並且 Kotlin 團隊非常鼓勵大家試用這一版本。
最後但同樣重要的一點是,「Beta」一詞本身就有呼籲社區提供反饋的意味。藉此術語,我們想讓您知道我們希望您能與我們分享反饋。
構建器推斷變更
構建器推斷是一種特殊的類型推斷,在調用泛型構建器函數時很有幫助。它可以幫助編譯器推斷調用的類型實參,方法是使用其 lambda 實參中其他調用的相關類型信息。
Kotlin 1.7.0-Beta 中包含了針對構建器推斷的更多變更。這些變更使我們的構建器推斷趨於穩定,我們在路線圖中的任務之一也趨於完成。
在此版本中,如果常規類型推斷無法獲得有關類型的足夠信息,則無需指定 -Xenable-builder-inference 編譯器選項(我們在 1.6.0 版本中引入),即可自動激活構建器推斷。
這意味着現在您無需應用任何額外的註解或選項,即可編寫自己的使用構建器類型推斷的構建器。了解如何編寫自定義通用構建器:https://kotlinlang.org/docs/using-builders-with-builder-inference.html
min() 和 max() 集合函數回歸
在 Kotlin 1.4 中,我們將min()和max()集合函數重命名為minOrNull()和maxOrNull()。這些新的名稱能夠更好地反映它們的行為 —— 如果接收器集合為空,則返回null。它還有助於使函數的行為與整個 Kotlin Collections API 中使用的命名慣例保持一致。
minBy()、maxBy()、minWith()和maxWith()同樣如此,在 Kotlin 1.4 中均具有自己的*OrNull()同義詞。受此變更影響的舊函數已逐漸棄用。
Kotlin 1.7.0-Beta 重新引入了原始的函數名稱,但加入了不可空返回類型。現在,更新後的min()、max()、minBy()、maxBy()、minWith()和maxWith()會嚴格返回集合元素或拋出異常。
請參見此 YouTrack 問題以了解詳情:https://youtrack.jetbrains.com/issue/KT-38854
絕對不可空類型得到穩定
Kotlin 1.7.0 將具有穩定的絕對不可空類型,這些類型是在 Kotlin 1.6.20 中引入的。
添加這些類型的目的是在擴展泛型 Java 類和接口時提供更好的互操作性。
自 Kotlin 1.6.20 起,您已經能夠使用新語法T & Any在使用站點上將泛型類型形參標記為絕對不可空。該語法形式來自相交類型表示法,現在被限制為一個類型形參,&左側為可空上限,右側為不可空Any:
在此測試版中,將默認啟用絕對不可空類型。無需其他步驟。
在 KEEP 中詳細了解絕對不可空類型:https://github.com/Kotlin/KEEP/blob/c72601cf35c1e95a541bb4b230edb474a6d1d1a8/proposals/definitely-non-nullable-types.md
正則表達式特定位置匹配
在 1.5.30 中引入的Regex.matchAt()和Regex.matchesAt()函數現已達到穩定版本。它們提供了一種方式來檢查正則表達式在String或CharSequence中的特定位置是否具有精確匹配。
matchesAt()可以檢查匹配並返回布爾結果:
matchAt()會在找到匹配的情況下返回匹配,在未找到匹配的情況下返回null:
我們將非常感謝您在此 YouTrack 問題中提供反饋:https://youtrack.jetbrains.com/issue/KT-34021
新版 Kotlin/Native 內存管理器
我們將繼續收集反饋,並改進新版 Kotlin/Native 內存管理器。目前,您可以在項目中試用 Alpha 版本。Kotlin 1.7.0-Beta 帶來了更多性能改進,這些改進將提升開發者體驗。
新版內存管理器消除了 JVM 與 Native 平台之間的差異。它在多平台項目中提供了一致的開發者體驗。例如,您可以更加輕鬆地開發同時適用於 Android 和 iOS 平台的新款跨平台移動應用程序。
新版 Kotlin/Native 內存管理器解除了線程間對象共享的限制。它還提供了安全且無需任何特殊管理或註解的無泄漏並發編程語言基元。新版內存管理器將成為未來版本中的默認管理器,因此我們鼓勵您立即試用。
詳細了解新版內存管理器並探索演示項目:https://blog.jetbrains.com/kotlin/2021/08/try-the-new-kotlin-native-memory-manager-development-preview/
或直接跳轉到遷移說明以親自試用:https://github.com/JetBrains/kotlin/blob/master/kotlin-native/NEW_MM.md
在您的項目中試用新版內存管理器以了解其運作方式,並在我們的問題跟蹤器 YouTrack 中分享您的反饋:https://youtrack.jetbrains.com/issue/KT-48525
JS 和 Native 中的命名捕獲組支持
從 Kotlin 1.7.0-Beta 起,不僅在 JVM(1.8 及更高版本)上支持,在 JS 和 Native 上也將支持命名捕獲組。
要為捕獲組命名,請在正則表達式中使用(?<name>group)語法。要獲取組匹配的文本,請調用新引入的MatchGroupCollection.get()函數並傳遞組名。
按名稱檢索匹配的組值
請思考這個匹配城市坐標的示例。要獲取正則表達式匹配的組的集合,請使用groups。比較使用value按組的編號(索引)和按組的名稱來檢索組的內容:
命名向後引用
現在,您在向後引用組時還可以使用組名。向後引用會匹配捕獲組先前匹配的相同文本。為此,請在正則表達式中使用\k<name>語法:
替換表達式中的命名組
最後,命名組引用可以與替換表達式一起使用。請思考用於將輸入中出現的所有正則表達式替換為替換表達式的replace()函數,以及僅交換第一個匹配項的replaceFirst()函數。
替換字符串中出現的各個${name}會被替換為與具有指定名稱的捕獲組對應的子序列。比較按名稱和按索引替換組引用:
試用新功能並提供反饋
您可以在 1.7.0 預覽版 Kotlin 1.7.0-Beta 中使用這些新功能。您可以輕鬆地將它安裝在 IntelliJ IDEA 或 Android Studio IDE 中。
由於 Android Studio 插件重命名(測試版),支持在 1.6.20 及後續版本中安裝插件。
請通過以下任一方式安裝 Kotlin 1.7.0-Beta:
如果您使用搶先體驗預覽更新通道,IDE 將在 1.7.0-Beta 可用時立即建議自動更新至該版本。
如果您使用穩定版更新通道,則可以隨時在您的 IDE 中選擇Tools|Kotlin|Configure Kotlin Plugin Updates(工具 | Kotlin | 配置 Kotlin 插件更新)以切換至搶先體驗預覽通道。然後,您將能夠安裝最新的預覽版。
請參閱說明以了解詳情:https://kotlinlang.org/docs/install-eap-plugin.html
完成 1.7.0-Beta 安裝後,不要忘記在您的構建腳本中將 Kotlin 版本更改為 1.7.0-Beta:
請參閱:https://kotlinlang.org/docs/configure-build-for-eap.html
如果您遇到任何問題:
向我們的問題跟蹤器 YouTrack 報告問題。
https://kotl.in/issue
在 Kotlin Slack 中的 #eap 頻道 中獲取幫助。
https://app.slack.com/client/T09229ZC6/C0KLZSCHF
(需提前申請以加入群組:https://surveys.jetbrains.com/s3/kotlin-slack-sign-up)
回滾到最新的穩定版本。參閱:
https://kotlinlang.org/docs/install-eap-plugin.html
本博文英文原作者:Danil Pavlov
相關閱讀
《Kotlin 的「新玩具」:Context Receivers(上下文接收器)》

《硬核拆解:K2 編譯器的台前幕後》

⏬ 戳「閱讀原文」了解更多