Карта коллекции, безопасная деструкция и последующее преобразование каждого элемента. Это семантика, которую я ожидал бы для выражения типа
val b = a map (((x, y), u) => ((y, x), u)))
К сожалению, в Scala нет краткого синтаксиса для достижения этой семантики.
Вместо этого вы должны разрушить себя:
val b = a map { p => ((p._1._2, p._1._1), p._2) }
Может возникнуть соблазн использовать определение значения для деструктуризации:
val b = a map { p => val ((x,y), u) = p; ((y, x), u) }
Однако эта версия не более безопасна, чем та, которая использует явное сопоставление с образцом . По этой причине, если вам нужна семантика безопасной деструктуризации, наиболее кратким решением является явный ввод вашей коллекции, чтобы предотвратить непреднамеренное расширение и использование явного сопоставления с образцом:
val a: List[((Int, Int), Int)] = // ...
// ...
val b = a map { case ((x, y), u) => ((y, x), u) }
Если определение a
кажется далеким от его использования (например, в отдельном модуле компиляции), вы можете минимизировать риск, указав его тип в вызове карты:
val b = (a: List[((Int, Int), Int)]) map { case ((x, y), u) => ((y, x), u) }