斯卡拉不变地图,什么时候去可变?
我现在的用例是微不足道的,无论是可变的还是不可变的,Map都会做到这一点。
有一个方法可以使用不可变的地图,然后调用第三方API方法,该方法也是一个不可变的地图 def doFoo(foo: String = "default",params: Map[String,Any] = Map()) { val newMap = if(someCondition) params + ("foo" -> foo) else params api.doSomething(newMap) } 有问题的地图一般会很小,最多可能是一个嵌套的案例类实例列表,最多可能有几千个条目。因此,在这种情况下(即通过newMap val副本具有基本上2个Map的实例),再次假定不变的影响很小。 不过,它让我有点困惑,复制地图只是为了获得一个新的地图,并附上几个k-&v。v条目。 我可以去mutable和params.put(“bar”,bar)等为我要粘贴的条目,然后params.toMap转换为不可变的api调用,这是一个选项。但是我不得不导入和传递可变地图,这与使用Scala的默认不可变地图相比有点麻烦。 那么对于在不可变地图上使用可变地图的理由/良好做法有什么一般的指导方针? 谢谢 编辑 解决方法
根据不可变的Map实现,添加一些条目可能不会真正复制整个原始的Map。这是不可变数据结构方法的优点之一:Scala将尽量避免复制。
这种行为是最容易看到的列表。如果我有一个val a = List(1,2,3),那么该列表存储在内存中。但是,如果我添加一个额外的元素,如val b = 0 :: a,我会得到一个新的4元素列表,但是Scala没有复制orignal列表a。相反,我们刚刚创建了一个名为b的新链接,并给它一个指向现有列表a的指针。 您也可以为其他类型的集合设想这样的策略。例如,如果我添加一个元素到地图,该集合可以简单地包装现有的地图,在需要的时候回到它,同时提供一个API,就像它是一个单一的地图。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |