Как разделить и типизировать список в Kotlin - PullRequest
2 голосов
/ 27 мая 2019

В Kotlin я могу:

val (specificMembers, regularMembers) = members.partition {it is SpecificMember}

Однако, насколько я знаю, я не могу сделать что-то вроде:

val (specificMembers as List<SpecificMember>, regularMembers) = members.partition {it is SpecificMember}

Мой вопрос был бы - есть ли идиоматический способ итеративного разделенияпо классу и типу, если нужно, передайте эти разделенные части.

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Если вам требуется эта функция чаще, вы можете просто переопределить действительную 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>>
2 голосов
/ 27 мая 2019

Функция partition вернет Pair<List<T>, List<T>> с T, являющимся универсальным типом вашего Iterable.Вы можете снова преобразовать разделенные значения, используя, например, let:

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