Если вам требуется эта функция чаще, вы можете просто переопределить действительную 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)
}
с использованием, аналогичным описанному ниже:
val (specificMembers, regularMembers) = members.partitionByType<SpecificMember, Member>()
// where specificMembers : List<SpecificMember>
// and regularMembers : List<Member> for this example
Обратите внимание, что таким образом вы также можете установить второй тип на более общий.Я оставляю это на ваше усмотрение, имеет ли это смысл.По крайней мере, в этом случае неконтролируемое приведение не требуется.
Альтернатива также показана Саймоном с использованием let
.Вы также можете напрямую привести результат partition
(без let
и другого Pair
) к любым значениям, например:
val (specificMembers, regularMembers) = members.partition {it is SpecificMember} as Pair<List<SpecificMember>, List<Member>>