我正在寻找一种方便的方法来安全地将List<T?>
强制转换为List<T>?
(或更笼统地说,将Iterable<T?>
强制转换为Iterable<T>?
),而无需过滤任何元素。
换句话说,如果所有元素都不为空,请使用列表。
在Swift中,我可以这样做:
let a: [Int?] = [1, nil, 3]
let b: [Int?] = [1, 2, 3]
let aa = a as? [Int] // nil
let bb = b as? [Int] // [1, 2, 3]
[在Kotlin中,类似的代码只是执行未经检查的强制转换,不会导致aa
为null
:
val a = listOf<Int?>(1, null, 3)
val b = listOf<Int?>(1, 2, 3)
val aa = a as? List<Int> // [1, null, 3]
val bb = b as? List<Int> // [1, 2, 3]
因此,我正在寻找这样的方法:
@Suppress("UNCHECKED_CAST")
fun <T : Any> Iterable<T?>.takeIfAllNotNull(): Iterable<T>? =
takeIf { all { el -> el != null } } as? Iterable<T>
因此,我可以编写如下代码:
val a = listOf<Int?>(1, null, 3)
val b = listOf<Int?>(1, 2, 3)
val aa = a.takeIfAllNotNull() // null
val bb = b.takeIfAllNotNull() // [1, 2, 3]
我必须在这里丢失一些东西。标准库没有这种方法吗?
标准库中没有类似的东西。您可以使用compactMap
,并且将获得一个包含所有非null值的数组,但这并不是您想要的。