mapę nad kolekcji, bezpiecznie i demontażu struktury następnie przekształcając każdy element. Są to semantyka że spodziewałbym dla wyrażenia jak
val b = a map (((x, y), u) => ((y, x), u)))
Niestety, nie ma zwięzły składnia do osiągnięcia tych semantykę w Scala. Zamiast tego trzeba destructure siebie:
val b = a map { p => ((p._1._2, p._1._1), p._2) }
Jeden może być skłonny do korzystania z definicji wartości dla destructuring:
val b = a map { p => val ((x,y), u) = p; ((y, x), u) }
Jednak ta wersja is no more safe than the one that uses explicit pattern matching. Z tego powodu, jeśli chcesz bezpiecznych semantykę destructuring, najbardziej zwięzły rozwiązaniem jest wyraźnie wpisać swoją kolekcję, aby zapobiec przypadkowemu poszerzenie i używać wyraźny dopasowanie Wzór:
val a: List[((Int, Int), Int)] = // ...
// ...
val b = a map { case ((x, y), u) => ((y, x), u) }
Jeżeli definicja a
„s pojawia się daleko od jego wykorzystania (np w osobnej jednostce kompilacji), można zminimalizować ryzyko, przypisując jej typ w zaproszeniu mapy:
val b = (a: List[((Int, Int), Int)]) map { case ((x, y), u) => ((y, x), u) }
Doskonałe. Dziękuję Ci. – Owen
Możesz pominąć jedną parę parenów/nawiasów: 'b map {case 1 =>" one "; case 2 => "two"} ' –
Dzięki tym konstrukcjom sugerowałbym, aby zawsze jawnie wpisywać kolekcję, którą mapujesz.W przeciwnym razie niezamierzone poszerzenie typu statycznego (poprzez inferencję typów lub refaktoryzację) może prowadzić do błędów typu, które pozostaną niewykryte do czasu wykonania: https://issues.scala-lang.org/browse/SI-4670 –