Kotlin擴展函數與高階函數-實際應用

概述

關於kotlin擴展函數與高階函數,網上有很多相關的資料介紹,包括官方文檔上也有詳細的說明。咱們就不再重複理論的介紹,通過一個簡單的應用場景來看看如何使用。

擴展函數

不通過繼承或使用 Decorator 模式,在已有類中添加新的方法,來實現某一具體功能。

高階函數

將函數作為參數或返回一個函數,稱為高階函數。

應用場景

當任意一個輸入框為空時,「註冊」按鈕為不可用狀態。

當所有輸入框都不為空時,「註冊」按鈕為可用狀態。

場景分析

  • 首先,需要監聽所有輸入框的輸入變化;
  • 其次,需要判斷所有輸入框是否都不為空;
  • 最後,根據判斷,設置「註冊」按鈕狀態;

根據我們的分析,按照傳統方式,我們需要同時給4個輸入框添加TextWatcher,並且每個都需要判斷其它幾個輸入框是否為空,再來設置按鈕。

但是,我們使用的是kotlin,既然最終改變的是按鈕的狀態,那我們就可以給按鈕擴展一個方法,來設置它的狀態,設置的依據通過擴展方法的參數傳入(高階函數)。

擴展方法代碼

fun Button.enable(et: EditText, method: () -> Boolean){ val btn = this et.addTextChangedListener(object : TextWatcher{ override fun afterTextChanged(s: Editable?) { } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { btn.isEnabled = method() } })}

以上代碼,

  • Button擴展了一個方法enable;
  • 第一個參數EditText,因為需要監聽它的變化;
  • 第二個參數是方法,方法的作用就是判斷是否所有輸入框都不為空,返回值是Boolean;
  • 在EditText監聽中動態設置按鈕是否可用;

判斷方法代碼

private fun isBtnEnable():Boolean{ return mMobileEt.text.isNotEmpty() && mVerifyCodeEt.text.isNotEmpty() && mPwdEt.text.isNotEmpty()&& mConfirmPwdEt.text.isNotEmpty() }

以上代碼,當所有輸入框都不為空時,返回true;否則,返回false

使用擴展方法

mRegisterBtn.enable(mMobileEt,{isBtnEnable()}) mRegisterBtn.enable(mVerifyCodeEt,{isBtnEnable()}) mRegisterBtn.enable(mPwdEt,{isBtnEnable()}) mRegisterBtn.enable(mConfirmPwdEt,{isBtnEnable()})

以上代碼,在初始化的時候,調用擴展方法,使用Lambda傳入方法參數。

小結

合理的使用擴展方法,可以極大程度地減少代碼量,並且邏輯也會很清晰,在需要的地方配合高階函數,事半功倍。

這只是一個簡單場景應用,更多精彩《Kotlin打造完整電商APP》

作者: 雷宇_

鏈接:imooc.com/article/22500

來源:慕課網

本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作

推薦閱讀:

插入迭代器inserter在copy函數的運行機制是什麼?
為什麼單機遊戲的啟動時間一般都比較長?有沒有辦法進行縮短?
從零開始寫個編譯器吧 - tao 語言的文法定義(下)
代碼里寫很多if會影響效率嗎?

TAG:Kotlin | 函數式編程 | 程序 |