繁体   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