Ответ 1
A Map
уже есть набор кортежей.
scala> "b" -> 2
res0: (String, Int) = (b,2) // Implicitly converted to a Tuple
Когда вы сопоставляете Map
, вы сопоставляете пары (ключ, значение), которые он содержит. Это не может работать, потому что вы удаляете ключи и сохраняете только значения. Итак, у вас уже нет Map
, но на два или три иерархии коллекции, Iterable
:
val r1 = m.map{ case (k,v) => v}
Принудительный тип не может работать, поскольку Map[A, B]
не является List[(A, B)]
. Это эквивалентно m.map(identity)
. Обратите внимание, что вы даже получаете доступ к e
с помощью аксессуаров для кортежей:
val r2: List[Tuple2[_,_]] = m.map(e => (e._1,e._2))
val r3 = m.map(e => toTuple(e._1,e._2))
Здесь Seq
более обобщен, чем List
:
val r4 = m.toSeq
Простым решением, описанным в @EndeNeu, является просто использование toList
. Когда вы Map
собираете, он должен вернуть исходный тип коллекции, если это возможно. Таким образом, сопоставление Map
должно возвращать еще один Map
, если только базовая структура не сделала это Map
(например, полностью удаление ключей) в r1
.