2012-04-12 1 views
3

종종 입력 소스에서지도를 작성하는 메소드를 구현하고 있습니다. 이 경우, 나는 더 빠른 속도와 효율성을 가정하고 scala.collection.mutable.Map을 사용합니다. 그러나이 컬렉션이 만들어지면 더 이상 변경할 수 없게됩니다.로컬로 변경 가능한 변경 가능 맵에서 변경 가능 맵을 반환하는 기본 방법은 무엇입니까?

가변적 인 맵에서 불변의 맵을 반환하는 것이 바람직한 스칼라 방법은 무엇입니까? 보통, 나는 분명히 작동하지만 냄새가 나는 myMap.toMap을합니다. 또는 반환 유형을 scala.collection.Map으로 설정할 수 있습니다. 새 컬렉션을 만들 필요는 없지만 독자를 혼란스럽게하는 것처럼 보입니다.

답장을 보내 주셔서 감사합니다.

+0

내가 [이 다른 질문 (http://stackoverflow.com/questions/26079146/scala-initializing-mutable-maps-and-exposing-them-as-immutable/26081768#에서와 같이'newBuilder'를 사용하여 생각 26081768) 그리고'.result'는 변경 가능한'Map'을 정의하는 것보다 스타일의 장점이있는 동등한 솔루션이 될 것입니다 – matanster

답변

7

가장 좋은 방법은 .toMap입니다. 짧고 깨끗하며 컬렉션을 immutable.Map으로 변환한다고 명시하는 명백한 방법입니다.

유형을 scala.collection.Map으로 설정하는 것이 실제로 혼란 스럽습니다. 또한 유형을 다시 설정하는 사람으로부터 당신을 보호하지 않습니다. 유형을 immutable.Map으로 만드는 것이 명확하고 안전합니다.

5

나는 왜 .toMap이 냄새라고 생각하는지 모르겠다. 그러나 분명히하고 싶다면 collection.immutable.Map() ++ myMap은 무슨 일이 일어나는지 명확히 문서화해야한다. (()을 잊지 마라. 그들은 선택적이 아니다.)

단순히 반환 유형을 변경해도 변경 불가능한 문제가 완전히 해결되지는 않는다. 돌연변이 방법은 더 이상 보이지 않지만 사용자는 쉽게 되돌릴 수 있습니다. 하지만 실제로는 변화가 없기 때문에 이것이 최고의 성능 접근 방식입니다.

+0

당신과 @ dhg의 응답을 모두 읽은 후에 toMap이 최선의 해결책이라고 동의합니다. 나는 toMap이 나에게 냄새를 맡았다 고 생각한다. 왜냐하면 나는 단지 변경 가능한 메소드를 숨기고 싶을 때 기존 컬렉션에서 새로운 컬렉션을 만드는 것이 잘못되었다고 생각하기 때문이다. (저는 매우 큰 콜렉션을 다루고 있습니다.) 말하자면, 클라이언트가 기본 가변형으로 되돌릴 수 있다는 것을 잊었습니다. 유형 안전 솔루션 ftw. – pathdependent

+0

@pathdependent - 속도가 중요한 경우 변경 가능 맵을 작성한 다음 불변 맵에 처음부터 불변 맵을 작성하는 것보다 빠르게 맵핑하는 것이 더 빠른지 확인해야합니다. 공간이 중요한 경우에는 처음부터 불변의지도를 만드는 것을 선호하고 싶으므로 동시에 두 개의지도가 필요하지 않습니다. –

0
import scala.collection._ 
import scala.collection.JavaConversions._ 

val myMap: mutable.Map[K,V] = ??? 
val unmodifiable: mutable.Map[K,V] = 
    java.util.Collections.unmodifiableMap[K,V](myMap) 
val newMap = unmodifiable.asInstanceOf[scala.collection.Map[K,V]] 

당신은 mutable.MapnewMap 캐스팅 할 수 있지만, 수정은 UnsupportedOperationException 발생합니다.

필자의 경우지도가 작아서 toMap이 더 빠르며 메모리를 적게 쓸 수 있습니다.