簡體   English   中英

具有可空參數和返回類型的通用方法

[英]Generalize method with nullable arguments and return type

我有一個轉換ByteArray?的方法ByteArray? 到base64 String? 因此,如果參數為null ,則輸出也將為null 這是它的實現:

fun toBase64String(array: ByteArray?): String? = if(array == null) null else 
    Base64.getEncoder().encodeToString(array)

但是當我傳入不為null的ByteArray方法時,它返回String? 這是預期的。 有沒有一種使它通用的方法,這樣的用例將是可能的:

val base64 = toBase64String(ByteArray(4))

其中base64將是String類型而不是String?類型String? 由於論點是不能為空的?

我剛剛開始與Kotlin一起工作,可能不知道使它成為可能的語言功能。

您可以進行兩個重載,一個重載可為空的ByteArray? 一個用於非null ByteArray

fun toBase64String(array: ByteArray): String =   
    Base64.getEncoder().encodeToString(array)

@JvmName("toBase64StringNullable")
fun toBase64String(array: ByteArray?): String? = 
    if (array == null) null else toBase64String(array)

我們需要@JvmName("...")以避免字節碼中的聲明沖突。 而且,這允許區分Java中的功能。

用法:

val nonNullBytes: ByteArray = TODO()
val nonNullString = toBase64String(nonNullBytes) // the inferred type is String

val nullableBytes: ByteArray? = TODO()
val nullableString = toBase64String(nullableBytes) // the inferred type is String?

當參數為非null類型ByteArray ,編譯器將選擇返回非null String的重載。

可能的重載方法是針對您的情況的最佳解決方案,但是出於完整性考慮,這里還有另外兩種方法可以實現僅使用一種方法(可為空的方法):

非空聲明運算符:

val base64: String = toBase64String(ByteArray(4))!!

Evlis運算符:

val base64: String = toBase64String(ByteArray(4)) ?: "defaultString"

如果參數為null,則輸出也將為null

如果那是函數遇到null參數時唯一要做的事情,那么最好聲明它接受非null值並使用安全調用來處理null:

fun toBase64String(array: ByteArray): String =   
    Base64.getEncoder().encodeToString(array)

val bytes: ByteArray? = ...
val base64 = bytes?.let { toBase64String(it) }
// the same can be written with function reference instead of lambda
val base64 = bytes?.let(::toBase64String)

在這里, let函數僅在bytes不為null時被調用,否則表達式的結果為null 調用時,它將調用lambda函數或作為其參數指定的函數引用,並將已檢查為不為null的ByteArray傳遞給該函數。

toBase64String聲明為ByteArray的擴展也可以更加方便,因此可以通過安全調用來調用它,而無需使用helper函數let

fun ByteArray.toBase64String(): String =   
    Base64.getEncoder().encodeToString(this)

val bytes: ByteArray? = ...
val base64 = bytes?.toBase64String()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM