다른 대답 바와 같이, 당신이 청소기 얻을 case classes
을 활용할 수는 데이터 개체를 입력했습니다. (워크 시트)
val m = Map("A" -> 1, "B" -> 2)
val m2 = m + ("A" -> 3)
결과 :하지만 경우에 당신이 필요가 맵을 업데이트하는 것입니다
이
m: scala.collection.immutable.Map[String,Int] = Map(A -> 1, B -> 2)
m2: scala.collection.immutable.Map[String,Int] = Map(A -> 3, B -> 2)
Map
에 +
운영자가 새로운 키 - 값 쌍을 추가 할 것입니다, 덮어 쓰기가 이미 존재하는 경우. 원래 값이 val
이므로 원래 값을 변경할 수 없기 때문에 결과를 새로운 val
에 지정해야합니다.
, 귀하의 예제에서,이 수동으로 다소 부담하게하고, 중첩 된 값을 다시 작성하고 있기 때문에이 일부 손실의 데이터를 산출
val m = Map("A" -> 1, "B" -> Map("X" -> 2, "Y" -> 4))
val m2 = m + ("B" -> Map("X" -> 3))
(중첩 Y
값이 사라) :
m: scala.collection.immutable.Map[String,Any] = Map(A -> 1, B -> Map(X -> 2, Y -> 4))
m2: scala.collection.immutable.Map[String,Any] = Map(A -> 1, B -> Map(X -> 3)) // Note that 'Y' has gone away.
따라서, 다음 원래 값을 복사 할 강제로 그것을 다시 재 지정 :
val m = Map("A" -> 1, "B" -> Map("X" -> 2, "Y" -> 4))
val b = m.get("B") match {
case Some(b: Map[String, Any]) => b + ("X" -> 3) // Will update `X` while keeping other key-value pairs
case None => Map("X" -> 3)
}
val m2 = m + ("B" -> b)
,451,515,
이는 '예상'결과를 얻을 수 있지만, 분명히 많은 코드입니다 : 요컨대
m: scala.collection.immutable.Map[String,Any] = Map(A -> 1, B -> Map(X -> 2, Y -> 4))
b: scala.collection.immutable.Map[String,Any] = Map(X -> 3, Y -> 4)
m2: scala.collection.immutable.Map[String,Any] = Map(A -> 1, B -> Map(X -> 3, Y -> 4))
, 어떤 불변의 데이터 구조와 때 '갱신'그것은 당신이 정말 당신이 원하는 모든 조각을 복사하는과 적절한 경우 업데이트 된 값을 포함합니다. 구조가 복잡하면 번거로울 수 있습니다. 따라서 @ 0 ___이 (가) Monocle과 같이 제공 한 권장 사항.
특히,'Map [String, Any]'는 Scala에서 재미 있지 않을 것입니다. – Ryan
@ Ryan : 어떤 수집 유형 서명의 "모든"나쁜 기호가 존재하지 않습니까? List [Any] etc. – Samar
예, 타입 시스템이 'Any'를 추론해야 할 때마다 실수했을 가능성이 있습니다. – Ryan