我有一个将ByteArray?
转换为base64 String?
的方法,这样如果参数是null
,那么null
输出也将是null
。这就是它的执行情况:
fun toBase64String(array: ByteArray?): String? = if(array == null) null else
Base64.getEncoder().encodeToString(array)
但是,当我传入不可空的ByteArray
方法时,会返回预期的String?
。是否有一种方法可以使它成为通用的,从而使这种用例成为可能:
val base64 = toBase64String(ByteArray(4))
base64
的类型是String
,而不是String?
,因为参数是不可空的?
我刚开始使用Kotlin,可能不知道语言特性可以实现这一点。
发布于 2017-08-24 13:05:26
可能重载方法是最好的解决方案,但是为了完整起见,还有另外两种方法可以实现:只使用一种方法(可空的方法):
非零断言操作符:
val base64: String = toBase64String(ByteArray(4))!!
Evlis算子:
val base64: String = toBase64String(ByteArray(4)) ?: "defaultString"
发布于 2017-08-26 15:54:57
如果参数为空,输出也将为空。
如果这是函数在遇到空参数时所做的唯一事情,最好声明它接受非空值,并使用安全调用来处理空值:
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
函数不是null时才调用bytes
函数,否则表达式的结果是null
。当被调用时,它将调用lambda函数或作为其参数指定的函数引用,将已被检查为非空的ByteArray
传递给该函数。
另外,将toBase64String
声明为ByteArray
的扩展也更方便,因此可以在不使用助手函数let
的情况下使用安全调用来调用它。“
fun ByteArray.toBase64String(): String =
Base64.getEncoder().encodeToString(this)
val bytes: ByteArray? = ...
val base64 = bytes?.toBase64String()
https://stackoverflow.com/questions/45862036
复制相似问题