如何在 Kotlin 中对列表进行分区和类型转换

sha*_*unc 5 casting partitioning kotlin

在 Kotlin 中我可以:

val (specificMembers, regularMembers) = members.partition {it is SpecificMember}
Run Code Online (Sandbox Code Playgroud)

但据我所知,我不能做这样的事情:

val (specificMembers as List<SpecificMember>, regularMembers) = members.partition {it is SpecificMember}
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 是否有一种惯用的方法可以按类对可迭代对象进行分区,并在需要时对这些分区部分进行类型转换。

Rol*_*and 6

partition如果您更频繁地需要该功能,您可以根据您的需要重新实现实际功能,例如:

inline fun <reified U : T, T> Iterable<T>.partitionByType(): Pair<List<U>, List<T>> {
  val first = ArrayList<U>()
  val second = ArrayList<T>()
  for (element in this) {
    if (element is U) first.add(element)
    else second.add(element)
  }
  return Pair(first, second)
}
Run Code Online (Sandbox Code Playgroud)

用法类似如下:

val (specificMembers, regularMembers) = members.partitionByType<SpecificMember, Member>()
// where specificMembers : List<SpecificMember>
// and regularMembers : List<Member> for this example
Run Code Online (Sandbox Code Playgroud)

请注意,通过这种方式,您还可以将第二种类型设置为更通用的类型。这是否有意义,我将其留给您。至少这样就不需要未经检查的演员阵容。

Simon 还通过 -usage 展示了替代方案letpartition您还可以直接将(withoutlet和 another )的结果转换Pair为任何适合的结果,例如:

val (specificMembers, regularMembers) = members.partition {it is SpecificMember} as Pair<List<SpecificMember>, List<Member>>
Run Code Online (Sandbox Code Playgroud)


s1m*_*nw1 2

partition函数将返回一个Pair<List<T>, List<T>>withT作为您的Iterable. 您可以使用例如再次转换分区值let

val (specificMembers, regularMembers) = lists
    .partition { it is SpecificMember }
    .let { Pair(it.first as List<SpecificMember>, it.second) }
Run Code Online (Sandbox Code Playgroud)