Kotlin(十四) 擴展函數和運算符重載

目錄

擴展函數

語法結構

代碼示例

運算符重載

語法結構

一元操作符

二元操作符

數值類型操作符

等于和不等于操作符

比較操作符

調用操作符


擴展函數

語法結構

對于擴張函數的語法結構其實很簡單,你想在那個類中添加擴張函數,那么你就用該類的類名加上點就可以,一般語法結構如下:

fun ClassName.methodName(): Int {return 0
}

代碼示例

fun String.lettersCount(): Int {var count = 0for (letterChar in this) {if (letterChar.isLetter()) count++}return count
}

我們只需要創建一個為String.kt的文件,對于文件名我們可以隨便命名,但是最好還是創建哪個類的擴展函數就以哪個類為文件名,這樣便于查找,也方便后續的合作開發。

我們將lettersCount()方法定義成了String類的擴展函數,那么函數中就自動擁有了String實例的上下文。因此lettersCount()函數就不再需要接收一個字符串參數了,而是直接遍歷this即可,因為現在this就代表著字符串本身。

定義好了擴展函數之后,統計某個字符串中的字母數量只需要這樣寫即可:

    val count = "dshdhakjdas2u121jksd23424h".lettersCount()println("含有$count 個字母")

除了String類之外,你還可以向任何類中添加擴展函數,Kotlin對此基本沒有限制。

運算符重載

語法結構

class Obj{operator fun plus(obj: Obj) : Obj{//處理邏輯}
}

運算符重載使用的是operator關鍵字,只要在指定函數的前面加上operator關鍵字,就可以實現運算符重載的功能了。

在上述語法結構中,關鍵字operator和函數名plus都是固定不變的,而接收的參數和函數返回值可以根據你的邏輯自行設定。那么上述代碼就表示一個Obj對象可以與另一個Obj對象相加,最終返回一個新的Obj對象。對應的調用方式如下:

val obj1 = Obj()
val obj2 = Obj()
val obj3 = obj1 + obj2

這種obj1 + obj2的語法看上去好像很神奇,但其實這就是Kotlin給我們提供的一種語法糖,它會在編譯的時候被轉換成obj1.plus(obj2)的調用方式。

了解了運算符重載的基本語法之后,下面我們開始實現一個更加有意義功能:讓兩個Money對象相加。

首先定義Money類的結構,這里我準備讓Money的主構造函數接收一個value參數,用于表示錢的金額。創建Money.kt文件,然后定義plus運算符重載,代碼如下所示:

class Money(val value: Int) {operator fun plus(money: Money): Money {val sum = money.value + valuereturn Money(sum)}
}

可以看到,這里使用了operator關鍵字來修飾plus()函數,這是必不可少的。在plus()函數中,我們將當前Money對象的value和參數傳入的Money對象的value相加,然后將得到的和傳給一個新的Money對象并將該對象返回。這樣兩個Money對象就可以相加了,就是這么簡單。除了plus()函數,Kotlin還提供了很多,如下:

一元操作符

操作符方法名
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.inc()

二元操作符

操作符方法名
a + ba.plus(b)
a – ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.mod(b)
a..ba.rangeTo(b)
a in bb.contains(a)
a !in b!b.contains(a)
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.modAssign(b)

數值類型操作符

操作符方法名
a[i]a.get(i)
a[i, j]a.get(i, j)
a[i_1, …, i_n]a.get(i_1, …, i_n)
a[i] = ba.set(i, b)
a[i, j] = ba.set(i, j, b)
a[i_1, …, i_n] = ba.set(i_1, …, i_n, b)

等于和不等于操作符

操作符方法名
a == ba?.equals(b) ?: (b === null)
a != b!(a?.equals(b) ?: (b === null))

比較操作符

操作符方法名
a > ba.compareTo(b) > 0
a < ba.compareTo(b) < 0
a >= ba.compareTo(b) >= 0
a <= ba.compareTo(b) <= 0

調用操作符

操作符方法名
a()a.invoke()
a(i)a.invoke(i)
a(i, j)a.invoke(i, j)
a(i_1, …, i_n)a.invoke(i_1, …, i_n)

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

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

相關文章

6. Zigzag Conversion

按照下標找規律注意leetcode的運行輸出&#xff0c;如果其中一組用例出現死循環&#xff0c;輸出結果會在一個文件&#xff0c;即部分測試用例正確&#xff0c;部分錯誤且出現死循環&#xff0c;則需辨別輸出結果屬于哪一份測試用例 class Solution { public:string convert(s…

(二)五種最新算法(SWO、COA、LSO、GRO、LO)求解無人機路徑規劃MATLAB

一、五種算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;簡介 1、蜘蛛蜂優化算法SWO 蜘蛛蜂優化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;該算法模型雌性蜘蛛蜂的狩獵、筑巢和交配行為&…

w3school學習筆記3(NumPy)

系列文章目錄 文章目錄 系列文章目錄前言一、NumPy簡介二、NumPy入門三、NumPy創建四、NumPy數組索引五、NumPy數組裁切六、NumPy數據類型七、NumPy副本/視圖八、NumPy數據形狀九、NumPy數組重塑十、NumPy數組迭代總結 前言 一、NumPy簡介 1、什么是Numpy&#xff1f; NumPy是…

線上盲盒小程序,開啟互聯網盲盒時代

近年來&#xff0c;盲盒經濟在國內非常火爆&#xff0c;各類盲盒品牌層出不窮&#xff0c;深受國內外年輕人、消費者的喜愛。 目前&#xff0c;根據數據顯示&#xff0c;盲盒市場不僅在線下異常火熱&#xff0c;線上盲盒也是成為了大眾的新選擇。各類電商平臺中盲盒的成交額更…

Esxi7Esxi8設置VMFSL虛擬閃存的大小

Esxi7Esxi8設置VMFSL虛擬閃存的大小 ESXi7,8 默認安裝會分配一個 VMFSL(VMFS-L)(Local VMFS)很大空間(120G), 感覺很浪費, 實際給 8G 就可以了, 最少 6G , 經實驗,給2G沒法安裝 . Esxi7是虛擬閃存的 修改的方法是: 在安裝時修改 設置 autoPartitionOSDataSize8192 在cdromBoo…

快捷切換raw頁面到repo頁面-Raw2Repo插件

Raw2Repo By Rick &#x1f4d6;快捷切換代碼托管平臺raw頁面到repo頁面 &#x1f517;github鏈接 https://github.com/rickhqh/Raw2Repo ?Features 功能&#xff1a; ?單擊 Raw2Repo 插件按鈕&#xff0c;即可跳轉到相應的代碼倉庫頁面。?支持 GitHub、Gitee、GitCode …

spring boot整合mybatis進行部門管理管理的增刪改查

部門列表查詢&#xff1a; 功能實現&#xff1a; 需求&#xff1a;查詢數據庫表中的所有部門數據&#xff0c;展示在頁面上。 準備工作&#xff1a; 準備數據庫表dept&#xff08;部門表&#xff09;&#xff0c;實體類Dept。在項目中引入mybatis的起步依賴&#xff0c;mysql的…

【ET8】1.ET8入門-運行指南

主要學習網址 論壇地址為&#xff1a;https://et-framework.cn Git地址為&#xff1a;GitHub - egametang/ET: Unity3D Client And C# Server Framework 官方QQ群 : 474643097 項目檢出 檢出項目切換到release8.0分支 GitHub地址&#xff1a;GitHub - egametang/ET: Unity…

[足式機器人]Part2 Dr. CAN學習筆記-數學基礎Ch0-5Laplace Transform of Convolution卷積的拉普拉斯變換

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN學習筆記-數學基礎Ch0-5Laplace Transform of Convolution卷積的拉普拉斯變換 Laplace Transform : X ( s ) L [ x ( t ) ] ∫ 0 ∞ x ( t ) e ? s t d t X\left( s \right) \mathcal{L} \left[ x\lef…

基于Swin_Transformer的圖像超分辨率系統

1.研究背景與意義 項目參考AAAI Association for the Advancement of Artificial Intelligence 研究背景與意義 隨著科技的不斷發展&#xff0c;圖像超分辨率技術在計算機視覺領域中變得越來越重要。圖像超分辨率是指通過使用計算機算法將低分辨率圖像轉換為高分辨率圖像的過…

AI:91-基于深度學習的手寫數學表達式識別

?? 本文選自專欄:人工智能領域200例教程專欄 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶有在本地跑過的核心代碼,詳細講解供大家學習,希望可以幫到大家。歡迎訂閱支持,正在不斷更新…

51單片機的時鐘電路與時序以及 復位電路和電源模式

51單片機的時鐘電路與時序以及 復位電路和電源模式 本文主要涉及51單片機的時鐘電路以及相關時序的知識&#xff0c;也講解了了51單片機的復位電路以及電源模式。 文章目錄 51單片機的時鐘電路與時序以及 復位電路和電源模式一、時鐘電路與時序1、 時鐘電路設計1.1 內部時鐘方式…

用stl寫一個自動打分比賽的案例

我們要實現六名選手進行隨機平均分為兩組&#xff0c;先分別淘汰兩組中的最后一名&#xff0c; 再決出第一名。 抽象選手 class player { public:string name;int score; }; 一個選手有名字和分數 首先我們需要vector容器保存選手的編號&#xff0c;便于后續的操作。 再用…

導入PR的視頻畫面是黑屏的怎么辦?

在現代視頻編輯領域中&#xff0c;越來越多的人使用Adobe Premiere Pro來編輯和制作視頻&#xff0c;但是在某些情況下&#xff0c;用戶可能需要透明背景的視頻進行創作&#xff0c;那么如何創作透明背景的視頻呢&#xff1f; 要制作具有透明背景的視頻&#xff0c;我們需要使…

如何贏得并留住訂閱者:12 個必須嘗試的訂閱營銷策略

Netflix、Hubspot、Spotify 和 Slack 都是流行的基于訂閱的服務&#xff0c;您可能每天都會使用它們&#xff0c;無論是工作還是娛樂。這些例子表明&#xff0c;訂閱業務模式深受 SaaS 創業者的青睞。 這種模式的吸引力很容易理解&#xff0c;特別是考慮到訂閱市場預計到 2025…

C //例10.5 有一個磁盤文件,內有一些信息。要求第1次將它的內容顯示在屏幕上,第2次把它復制到另一文件上。

C程序設計 &#xff08;第四版&#xff09; 譚浩強 例10.5 例10.5 有一個磁盤文件&#xff0c;內有一些信息。要求第1次將它的內容顯示在屏幕上&#xff0c;第2次把它復制到另一文件上。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差異。 代碼塊 方法&a…

mysql支持的整數類型、各類型整數能夠表示的數值范圍

MySQL :: MySQL 8.2 Reference Manual :: 11.1.2 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT mysql支持的整數有&#xff1a;TINYINT、SMALLINT、MEDIUMINT、INT&#xff08;INT和INTEGER是同義詞&#xff09;、BIGINT&#xff0c;各…

【C#】序列化和反序列化,以及System.Text.Json和Newtonsoft.Json比較

給自己一個目標&#xff0c;然后堅持一段時間&#xff0c;總會有收獲和感悟&#xff01; 序列化和反序列化&#xff0c;在實際項目開發過程中用的最多。特別是有對接接口的小伙伴就深有體會。本篇文章就簡單聊聊這個知識點。 目錄 一、基本概念1.1、序列化1.2反序列化1.3、舉例…

AI 賦能 | 智能制造的 AI 算法開發和工程實現

談到智能制造、智慧工廠&#xff0c;愿景是美好的&#xff0c;借助計算機視覺技術和 AI 算法&#xff0c;為自動化生產線賦予環境感知的能力&#xff0c;從而改善工藝流程&#xff0c;提高生產效率。但是&#xff0c;隨著柔性化生產的需求增長&#xff0c;產線的布局調整和功能…

鎖的策略及synchronized詳解

加鎖過程中&#xff0c;處理沖突的過程中&#xff0c;涉及到的一些不同的處理方式。鎖的策略決定了線程如何獲取和釋放鎖以及在何種情況下阻塞和喚醒線程。 1. 常見的鎖策略 1.1 樂觀鎖和悲觀鎖 樂觀鎖&#xff1a;在加鎖之前&#xff0c;預估當前出現鎖沖突的概率不大&am…