Kotlin之內聯回調函數


let

定義:

let擴展函數的實際上是一個作用域函數,當你需要去定義一個變量在一個特定的作用域范圍內,let函數的是一個不錯的選擇;let函數另一個作用就是可以避免寫一些判斷null的操作。

翻譯:

使用object.let{}可以在代碼塊里使用it代替object進行操作,節省代碼並且增加可讀性,還可以判空

示例:

不使用let:

mVideoPlayer?.setVideoView(activity.course_video_view)
mVideoPlayer?.setControllerView(activity.course_video_controller_view)
mVideoPlayer?.setCurtainView(activity.course_video_curtain_view)

使用let:


mVideoPlayer?.let {
    it.setVideoView(activity.course_video_view)
    it.setControllerView(activity.course_video_controller_view)
    it.setCurtainView(activity.course_video_curtain_view)
}

with

定義

它是將某對象作為函數的參數,在函數塊內可以通過 this 指代該對象。返回值為函數塊的最后一行或指定return表達式。

翻譯

使用with(object){}可以在代碼塊里用this代替object操作。還可以省略this,直接使用該類的方法

示例

不使用with:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    ArticleSnippet item = getItem(position);
    if (item == null) return;
    holder.tvNewsTitle.setText(StringUtils.trimToEmpty(item.titleEn));
    holder.tvNewsSummary.setText(StringUtils.trimToEmpty(item.summary));
    String gradeInfo = "難度:" + item.gradeInfo;
    String wordCount = "單詞數:" + item.length;
    String reviewNum = "讀后感:" + item.numReviews;
    String extraInfo = gradeInfo + " | " + wordCount + " | " + reviewNum;
    holder.tvExtraInfo.setText(extraInfo);
}

使用with:

override fun onBindViewHolder(holder: ViewHolder, position: Int){
    val item = getItem(position)?: return
    with(item){
        holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
        holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
        holder.tvExtraInf.text = "難度:$gradeInfo | 單詞數:$length | 讀后感: $numReviews"
    }
}

run

定義

run函數是let,with兩個函數結合體,准確來說它
1)彌補了let函數在函數體內必須使用it參數替代對象,在run函數中可以像with函數一樣可以省略,直接訪問實例的公有屬性和方法;
2)另一方面它彌補了with函數傳入對象判空問題,在run函數中可以像let函數一樣做判空處理

示例

使用with:

override fun onBindViewHolder(holder: ViewHolder, position: Int){
   val item = getItem(position)?: return
   with(item){
       holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
       holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
       holder.tvExtraInf = "難度:$gradeInfo | 單詞數:$length | 讀后感: $numReviews"
   }
}

使用run:

override fun onBindViewHolder(holder: ViewHolder, position: Int){
    getItem(position)?.run{
        holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
        holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
        holder.tvExtraInf = "難度:$gradeInfo | 單詞數:$length | 讀后感: $numReviews"
    }
}

apply

定義

整體作用功能和run函數很像,唯一不同點就是:apply返回的值是對象本身,而run函數是一個閉包形式返回,返回的是最后一行的值。

正是基於這一點差異它的適用場景稍微與run函數有點不一樣。apply一般用於一個對象實例初始化的時候,需要對對象中的屬性進行賦值。或者動態inflate出一個XML的View的時候需要給View綁定數據也會用到,這種情景非常常見。特別是在我們開發中會有一些數據model向View model轉化實例化的過程中需要用到。

示例

不使用apply:

mSheetDialogView = View.inflate(activity, R.layout.biz_exam_plan_layout_sheet_inner, null)
mSheetDialogView.course_comment_tv_label.paint.isFakeBoldText = true
mSheetDialogView.course_comment_tv_score.paint.isFakeBoldText = true
mSheetDialogView.course_comment_tv_cancel.paint.isFakeBoldText = true
mSheetDialogView.course_comment_tv_confirm.paint.isFakeBoldText = true
mSheetDialogView.course_comment_seek_bar.max = 10
mSheetDialogView.course_comment_seek_bar.progress = 0

使用apply:

mSheetDialogView = View.inflate(activity, R.layout.biz_exam_plan_layout_sheet_inner, null).apply{
   course_comment_tv_label.paint.isFakeBoldText = true
   course_comment_tv_score.paint.isFakeBoldText = true
   course_comment_tv_cancel.paint.isFakeBoldText = true
   course_comment_tv_confirm.paint.isFakeBoldText = true
   course_comment_seek_bar.max = 10
   course_comment_seek_bar.progress = 0
}

also

定義

also函數和let很像,只是唯一的不同點就是:let函數最后的返回值是最后一行的返回值而,also函數的返回值是返回當前的這個對象。一般可用於多個擴展函數鏈式調用

各個函數的區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM