广播或转换List 到List ?

问题描述 投票:0回答:1

我正在寻找一种方便的方法来安全地将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中,类似的代码只是执行未经检查的强制转换,不会导致aanull

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]

我必须在这里丢失一些东西。标准库没有这种方法吗?

swift kotlin casting iterable
1个回答
0
投票

标准库中没有类似的东西。您可以使用compactMap,并且将获得一个包含所有非null值的数组,但这并不是您想要的。

© www.soinside.com 2019 - 2024. All rights reserved.