【Kotlin 入門指南】Java 和 Kotlin 混合使用 - Function Types

【Kotlin 入門指南】Java 和 Kotlin 混合使用 - Function Types

更新於 發佈於 閱讀時間約 4 分鐘
【Kotlin 入門指南】系列文章目錄:https://bit.ly/3t8awwL
Kotlin 線上課程教學影片:https://bit.ly/3qJ5a5Q

FunctionTypes

Kotlin 的函式可以作為參數使用,它們被歸類為一種資料型別,稱為「Function Types」。當 Java 呼叫這種型別的 Kotlin 函式時,會使用 invoke 關鍵字進行呼叫。通過反編譯程式碼,可以得知 Kotlin 中的 Function Types 資訊。

Kotlin Function Types 範例檔案目錄結構

檔名錯誤或檔案放置不正確的情況下,將會導致編譯錯誤或呼叫時的問題,需要特別留意:

  • 「Main.kt」放在「src/main/kotlin」目錄裡面。
  • 「JavaClassDemo.java」要放在「src/main/java/com.teachable.hkt」目錄裡面。
raw-image

Main.kt

//沒有設定 package 名稱,Java 無法順利呼叫使用
package com.teachable.hkt

class KotlinClassDemo {
//val greeting: (String) -> Unit = { it -> println(it) }
val greeting = { msg: String -> println(msg) }
}

fun main() {
val k = KotlinClassDemo()
k.greeting("哈囉~HKT線上教室")
}

JavaClassDemo.java

package com.teachable.hkt;

import kotlin.Unit;
import kotlin.jvm.functions.Function1;

public class JavaClassDemo {
public static void main(String[] args) {
KotlinClassDemo k = new KotlinClassDemo();
//FunctionN 0~22 參數,最多23個參數
Function1<String, Unit> javaK = k.getGreeting();
javaK.invoke("哈囉~HKT線上教室");
}
}

在這個範例中,javaK 變數的型別是 Function1<String, Unit>。這意味著它是一個接收一個字串參數(String)並返回 Unit(類似於 Java 中的 void)的函數。

k.getGreeting() 返回的是一個能夠接收一個字串參數的函數,因此這個函數符合 Function1<String, Unit> 這個型別的要求。

最後,透過 javaK.invoke("哈囉~HKT線上教室"),實際呼叫了這個函數,傳遞了一個字串參數 "哈囉~HKT線上教室"。整體來說,Function Types 讓你可以把函數當作物件來操作,以更靈活地傳遞和使用它們。

avatar-img
HKT實驗室
19會員
261內容數
哈囉!歡迎光臨我的沙龍!我是 KT,一位對應用程式開發充滿熱情的開發者。在這個專屬空間,我將與您分享我在應用開發領域的深入學習心得和豐富的實戰經驗。如果您對應用程式開發技術同樣充滿好奇,渴望不斷探索新知,歡迎成為我們的會員,一起在應用程式開發的旅途上,探索更深層次的技術世界,享受學習的樂趣。
留言
avatar-img
留言分享你的想法!
HKT實驗室 的其他內容
當你在 Kotlin 程式語言中定義一個有預設參數的函數功能,並給它預設值,@JvmOverloads 可以自動產生多個重載版本的 Java 方法,每個版本都省略了部分參數,讓 Java 代碼可以更簡潔地呼叫這些方法,而不需要填寫所有參數。不會因為沒有預設值,而顯示錯誤。
Companion Object 是 Kotlin 中一個特殊的物件,用來在類別內部創建靜態成員。當你在一個類別內部建立 companion object 時,裡面的成員就可以像 Java 中的靜態成員一樣被使用,不需要通過該類別的實例來訪問。 結合使用 @JvmStatic 和 Companion
當你在 Kotlin 中使用 val 或 var 定義一個屬性時,在 Java 中預設會轉換為 getter 和 setter 方法。如果你希望直接在 Java 中存取這個屬性,可以使用 @JvmField 註解。這會讓 Kotlin 編譯器將屬性生成為公開的,而非生成 getter 和 sette
在混合開發的 Java 和 Kotlin 項目中,函數命名衝突是一個常見的問題。這時可以利用@JvmName 註解來解決這樣的狀況。@JvmName 註解非常實用,它可以讓你更靈活地控制在 JVM 平台上生成的 Kotlin 程式碼名稱。
let 區域函數是 Kotlin 中一個非常實用的工具,特別適用於處理可空對象。它讓程式碼更加簡潔、安全,同時提高了可讀性。透過 let 區域函數,我們可以更優雅地處理可空性問題,使得程式開發更加高效順暢。
run 函數,可以把它視為 let 和 with 兩者合而為一出來的一個函數。怎麼說呢? 因為 run 函數,如同 let 函數可以優雅的判斷物件是否為 null。也同時擁有 with 函數,對同一個對象多次設定屬性的便捷寫法。
當你在 Kotlin 程式語言中定義一個有預設參數的函數功能,並給它預設值,@JvmOverloads 可以自動產生多個重載版本的 Java 方法,每個版本都省略了部分參數,讓 Java 代碼可以更簡潔地呼叫這些方法,而不需要填寫所有參數。不會因為沒有預設值,而顯示錯誤。
Companion Object 是 Kotlin 中一個特殊的物件,用來在類別內部創建靜態成員。當你在一個類別內部建立 companion object 時,裡面的成員就可以像 Java 中的靜態成員一樣被使用,不需要通過該類別的實例來訪問。 結合使用 @JvmStatic 和 Companion
當你在 Kotlin 中使用 val 或 var 定義一個屬性時,在 Java 中預設會轉換為 getter 和 setter 方法。如果你希望直接在 Java 中存取這個屬性,可以使用 @JvmField 註解。這會讓 Kotlin 編譯器將屬性生成為公開的,而非生成 getter 和 sette
在混合開發的 Java 和 Kotlin 項目中,函數命名衝突是一個常見的問題。這時可以利用@JvmName 註解來解決這樣的狀況。@JvmName 註解非常實用,它可以讓你更靈活地控制在 JVM 平台上生成的 Kotlin 程式碼名稱。
let 區域函數是 Kotlin 中一個非常實用的工具,特別適用於處理可空對象。它讓程式碼更加簡潔、安全,同時提高了可讀性。透過 let 區域函數,我們可以更優雅地處理可空性問題,使得程式開發更加高效順暢。
run 函數,可以把它視為 let 和 with 兩者合而為一出來的一個函數。怎麼說呢? 因為 run 函數,如同 let 函數可以優雅的判斷物件是否為 null。也同時擁有 with 函數,對同一個對象多次設定屬性的便捷寫法。