摘要:項(xiàng)目實(shí)戰(zhàn)教程第章擴(kuò)展函數(shù)與屬性在使用的時(shí)候,我們經(jīng)常使用諸如等等一堆工具類,代碼寫起來也比較冗長。本章我們介紹的擴(kuò)展函數(shù)和屬性。擴(kuò)展函數(shù)中提供了非常簡(jiǎn)單使用的擴(kuò)展函數(shù)功能。
《Kotlin 項(xiàng)目實(shí)戰(zhàn)教程》
第6章 擴(kuò)展函數(shù)與屬性
在使用Java的時(shí)候,我們經(jīng)常使用諸如StringUtil, DateUtil等等一堆工具類,代碼寫起來也比較冗長。舉個(gè)例子,獲取一個(gè)字符串的第一個(gè)字符值、最后一個(gè)字符值。如果我們用Java代碼來寫,通常是要先聲明一個(gè)StringUtil類,然后在里面寫相應(yīng)的工具方法,代碼可以是下面的這個(gè)樣子
package com.easy.kotlin; import static java.lang.System.out; public class StringUtil { /** * 獲取str的第一個(gè)字符值 * * @param str * @return */ public static String firstChar(String str) { if (str != null && str.length() > 0) { return str.charAt(0) + ""; } return ""; } /** * 獲取str的最后一個(gè)字符值 * * @param str * @return */ public static String lastChar(String str) { if (str != null && str.length() > 0) { return str.charAt(str.length() - 1) + ""; } return ""; } public static void main(String[] args) { String str = "abc"; out.println(StringUtil.firstChar(str)); // a out.println(StringUtil.lastChar(str)); // c } }
我們可以看到 StringUtil.firstChar(str) 這樣的調(diào)用方式不夠簡(jiǎn)單直接。能不能直接這樣調(diào)用
"abc".firstChar() "abc".lastChar()
非常遺憾的是,在Java中我們無法給String類添加一個(gè)自定義方法。因?yàn)镾tring類是JDK中內(nèi)置的基礎(chǔ)類,而且為final,不能修改。所以,Java程序員通常使用這樣的一個(gè)變通的方法:開發(fā)一個(gè)StringUtil類,在里面封裝所需要的String操作的方法。而不是修改或繼承String類。
而情況到了Kotlin里面,就完全不一樣了——我們完全可以自由擴(kuò)展任何類的方法和屬性。在不修改原類的情況下, Kotlin能給一個(gè)類擴(kuò)展新功能而無需繼承該類。
本章我們介紹Kotlin的擴(kuò)展函數(shù)和屬性。
6.1 擴(kuò)展函數(shù)Kotlin中提供了非常簡(jiǎn)單使用的擴(kuò)展函數(shù)功能。我們可以為現(xiàn)有的類自由添加自定義的函數(shù) 。
6.1.1 給String類擴(kuò)展兩個(gè)函數(shù)例如,我們現(xiàn)在給String類擴(kuò)展兩個(gè)函數(shù):lastChar() 和 firstChar() , 實(shí)現(xiàn)代碼如下
package com.easy.kotlin fun String.lastChar(): String { if (this.length == 0) { return "" } return this[this.length - 1].toString() } fun String.firstChar(): String { if (this.length == 0) { return "" } return this[0].toString() }
擴(kuò)展函數(shù)的語法,我們用下圖來簡(jiǎn)單說明
然后,我們就可以在代碼中直接調(diào)用了
fun main(args: Array) { val str = "abc" println(str.firstChar()) // a println(str.lastChar()) // c }
如果在其他package路徑下面,需要 import 導(dǎo)入擴(kuò)展函數(shù)
package com.easy.kotlin.tutorial // 跟擴(kuò)展函數(shù)不在同一個(gè)包路徑下面 import com.easy.kotlin.firstChar // 導(dǎo)入擴(kuò)展函數(shù) firstChar import com.easy.kotlin.lastChar// 導(dǎo)入擴(kuò)展函數(shù) lastChar fun main(args: Array6.1.2 給 List 類擴(kuò)展一個(gè)過濾函數(shù)) { val str = "abc" str.firstChar() // 這樣的調(diào)用方式要比 StringUtil.firstChar(str) 簡(jiǎn)單優(yōu)雅許多 str.lastChar() }
在上一章中我們介紹過List的filter函數(shù)。那么這個(gè) filter 函數(shù)是怎樣實(shí)現(xiàn)的呢? 如果我們自己來給List類擴(kuò)展一個(gè)過濾函數(shù),應(yīng)該怎樣去做呢?下面我們就來介紹。
為了更加深刻體會(huì)到 Kotlin 擴(kuò)展功能的簡(jiǎn)單優(yōu)雅性,我們先來看看在Java中是怎樣實(shí)現(xiàn)的吧!首先,我們會(huì)去聲明一個(gè)ListUtil 類,里面實(shí)現(xiàn)一個(gè) List
public class ListUtil{ /** * 根據(jù)謂詞p 過濾 list 中的元素 * * @param list * @param p * @return */ public List filter(List list, Predicate p) { List result = new ArrayList<>(); for (T t : list) { if (p.predicate(t)) { result.add(t); } } return result; } }
其中,Predicate 接口聲明如下
interface Predicate{ Boolean predicate(T t); }
然后,我們?cè)诖a中這樣使用這個(gè) filter 方法
public static void main(String[] args) { Listlist = Arrays.asList(new Integer[] {1, 2, 3, 4, 5, 6, 7}); ListUtil listUtil = new ListUtil(); // 聲明ListUtil對(duì)象 List result = listUtil.filter(list, (it) -> it % 2 == 1); // lambda 表達(dá)式 out.println(result); // [1, 3, 5, 7] }
為了調(diào)用 filter 方法,我們還要聲明一個(gè)ListUtil對(duì)象,費(fèi)事。能不能直接像下面這樣調(diào)用?
list.filter { it % 2 == 1 }
答案是肯定的,只不過是在Kotlin中,而不是在Java中。
我們就來使用Kotlin的擴(kuò)展函數(shù)為List擴(kuò)展一個(gè)filter函數(shù),代碼如下
funList .filter(predicate: (T) -> Boolean): MutableList { val result = ArrayList () this.forEach { if (predicate(it)) { result.add(it) } } return result }
這個(gè)函數(shù)的簽名稍微有點(diǎn)復(fù)雜,我們用下圖來形象化地簡(jiǎn)單說明
然后,我們?cè)诖a中只需要這樣調(diào)用即可
val list = mutableListOf(1, 2, 3, 4, 5, 6, 7) val result = list.filter { it % 2 == 1 } println(result) // [1, 3, 5, 7]
Kotlin的標(biāo)準(zhǔn)庫API中使用擴(kuò)展的功能,通過擴(kuò)展Java的API,提供了大量的實(shí)用簡(jiǎn)單的函數(shù)。我們將在后面的關(guān)于文件IO、正則表達(dá)式、多線程等相關(guān)主題中介紹。
6.2 擴(kuò)展屬性除了擴(kuò)展一個(gè)類的函數(shù),我們還可以擴(kuò)展類屬性。例如,我們給 MutableList 擴(kuò)展兩個(gè)屬性:firstElement 和 lastElement , 實(shí)現(xiàn)代碼如下
varMutableList .firstElement: T get() { return this[0] } set(value) { this[0] = value } var MutableList .lastElement: T get() { return this[this.size - 1] } set(value) { this[this.size - 1] = value }
上面的代碼中的擴(kuò)展屬性的語法說明如下圖所示
然后,我們就可以在代碼中直接使用擴(kuò)展的屬性了
val list = mutableListOf(1, 2, 3, 4, 5, 6, 7) println("list = ${list}") // list = [1, 2, 3, 4, 5, 6, 7] println(list.firstElement) // 調(diào)用getter 函數(shù) , 值是 1 println(list.lastElement) // 7 list.firstElement = -1 // 調(diào)用 setter 函數(shù) list.lastElement = -7 println("list = ${list}") // list = [-1, 2, 3, 4, 5, 6, -7] println(list.firstElement) // -1 println(list.lastElement) // -7
擴(kuò)展屬性允許定義在類或者kotlin文件中,不允許定義在函數(shù)中。
6.3 擴(kuò)展中的this關(guān)鍵字我們有注意到,在上面的List的擴(kuò)展函數(shù)filter的實(shí)現(xiàn)中,我們有用到一個(gè)this關(guān)鍵字
this.forEach { if (predicate(it)) { result.add(it) } }
這里的 this 指的是 接收者對(duì)象(receiver object), 也就是調(diào)用擴(kuò)展函數(shù)時(shí), 在點(diǎn)號(hào)( . )之前指定的對(duì)象實(shí)例。
本章小結(jié)文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67765.html
摘要:下一代服務(wù)端開發(fā)下一代服務(wù)端開發(fā)第部門快速開始第章快速開始環(huán)境準(zhǔn)備,,快速上手實(shí)現(xiàn)一個(gè)第章企業(yè)級(jí)服務(wù)開發(fā)從到語言的缺點(diǎn)發(fā)展歷程的缺點(diǎn)為什么是產(chǎn)生的背景解決了哪些問題為什么是的發(fā)展歷程容器的配置地獄是什么從到下一代企業(yè)級(jí)服務(wù)開發(fā)在移動(dòng)開發(fā)領(lǐng)域 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開發(fā) 》 Kotlin + Spring Boot : 下一代 Java...
摘要:于是我就先把這本薄的經(jīng)典書語言精粹修訂版豆瓣讀書本書簡(jiǎn)介總共章,除去附錄,才頁,讀完并記錄了一些筆記。讀書筆記還可以分享給別人看。編程語言第版定義了的標(biāo)準(zhǔn)。程序檢查時(shí)丟棄值為函數(shù)的屬性。 之前看到這篇文章,前端網(wǎng)老姚淺談:怎么學(xué)JavaScript?,說到怎么學(xué)習(xí)JavaScript,那就是看書、分析源碼。10本書讀2遍的好處,應(yīng)該大于一本書讀20遍??磿鲃?dòng)學(xué)習(xí),看視頻是被動(dòng)學(xué)習(xí)。看...
摘要:最近讀完編寫可維護(hù)的,讓我受益匪淺,它指明了編碼過程中,需要注意的方方面面,在團(tuán)隊(duì)協(xié)作中特別有用,可維護(hù)性是一個(gè)非常大的話題,這本書是一個(gè)不錯(cuò)的起點(diǎn)。擴(kuò)展閱讀編寫可維護(hù)的歡迎來到石佳劼的博客,如有疑問,請(qǐng)?jiān)谠脑u(píng)論區(qū)留言,我會(huì)盡量為您解答。 最近讀完《編寫可維護(hù)的JavaScript》,讓我受益匪淺,它指明了編碼過程中,需要注意的方方面面,在團(tuán)隊(duì)協(xié)作中特別有用,可維護(hù)性是一個(gè)非常大的話...
摘要:設(shè)計(jì)方案的容易改變這就是所謂的軟件構(gòu)建的可維護(hù)性,可擴(kuò)展性和靈活性。這也可能表明類型或方法可能難以維護(hù)?;谠创a中不同運(yùn)算符和操作數(shù)的數(shù)量的合成度量。對(duì)修改的封閉這種模塊的源代碼是不可侵犯的。 大綱 軟件維護(hù)和演變可維護(hù)性度量模塊化設(shè)計(jì)和模塊化原則OO設(shè)計(jì)原則:SOLIDOO設(shè)計(jì)原則:GRASP總結(jié) 軟件維護(hù)和演變 什么是軟件維護(hù)? 軟件工程中的軟件維護(hù)是交付后修改軟件產(chǎn)品以糾正故障...
摘要:第二種接口的概念和面向?qū)ο缶幊滔嚓P(guān)接口視為一份合約,在合約里可以定義這份合約的類或接口的行為接口告訴類,它需要實(shí)現(xiàn)一個(gè)叫做的方法,并且該方法接收一個(gè)參數(shù)。 定場(chǎng)詩 八月中秋白露,路上行人凄涼; 小橋流水桂花香,日夜千思萬想。 心中不得寧靜,清早覽罷文章, 十年寒苦在書房,方顯才高志廣。 前言 洛伊安妮·格羅納女士所著的《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法》第三版于2019年的5月份...
閱讀 3263·2021-11-23 09:51
閱讀 1059·2021-08-05 09:58
閱讀 696·2019-08-29 16:05
閱讀 1002·2019-08-28 18:17
閱讀 3059·2019-08-26 14:06
閱讀 2753·2019-08-26 12:20
閱讀 2194·2019-08-26 12:18
閱讀 3091·2019-08-26 11:56