成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

第6章 擴(kuò)展函數(shù)與屬性

wangdai / 2138人閱讀

摘要:項(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: Array) {
    val str = "abc"
    str.firstChar() // 這樣的調(diào)用方式要比 StringUtil.firstChar(str) 簡(jiǎn)單優(yōu)雅許多
    str.lastChar() 
}
6.1.2 給 List 類擴(kuò)展一個(gè)過濾函數(shù)

在上一章中我們介紹過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 filter(List list, Predicate p) 方法,代碼如下

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) {
        List list = 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ù),代碼如下

fun  List.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)代碼如下

var  MutableList.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

相關(guān)文章

  • 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開發(fā) 》

    摘要:下一代服務(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...

    springDevBird 評(píng)論0 收藏0
  • 《JavaScript語言精粹 修訂版》 讀書筆記

    摘要:于是我就先把這本薄的經(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í)。看...

    EscapedDog 評(píng)論0 收藏0
  • 《編寫可維護(hù)的JavaScript》之編程實(shí)踐

    摘要:最近讀完編寫可維護(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è)非常大的話...

    張春雷 評(píng)論0 收藏0
  • 6:可維護(hù)性軟件構(gòu)建方法 6.1可維護(hù)性的度量和構(gòu)造原則

    摘要:設(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)品以糾正故障...

    chanjarster 評(píng)論0 收藏0
  • 重讀《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)算法-三版》-2 ECMAScriptTypeScr

    摘要:第二種接口的概念和面向?qū)ο缶幊滔嚓P(guān)接口視為一份合約,在合約里可以定義這份合約的類或接口的行為接口告訴類,它需要實(shí)現(xiàn)一個(gè)叫做的方法,并且該方法接收一個(gè)參數(shù)。 定場(chǎng)詩 八月中秋白露,路上行人凄涼; 小橋流水桂花香,日夜千思萬想。 心中不得寧靜,清早覽罷文章, 十年寒苦在書房,方顯才高志廣。 前言 洛伊安妮·格羅納女士所著的《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法》第三版于2019年的5月份...

    TZLLOG 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<